Получите общую доступную системную память с PHP на Windows
Используя PHP, я хотел бы получить общую доступную для системы память (а не только свободную или использованную память).
В Linux это довольно просто. Ты можешь сделать:
$memory = fopen('/proc/meminfo');
а затем проанализируйте файл.
Кто-нибудь знает об эквивалентном методе для Windows? Я открыт для любых предложений.
Изменить: У нас есть решение (но Stackru не позволит мне ответить на мой собственный вопрос):
exec( 'systeminfo', $output );
foreach ( $output as $value ) {
if ( preg_match( '|Total Physical Memory\:([^$]+)|', $value, $m ) ) {
$memory = trim( $m[1] );
}
Не самое элегантное решение, и оно очень медленное, но соответствует моим потребностям.
2 ответа
Вы можете сделать это через exec
:
exec('wmic memorychip get capacity', $totalMemory);
print_r($totalMemory);
Это напечатает (на моей машине, имеющей 2x2 и 2x4 блока оперативной памяти):
Array
(
[0] => Capacity
[1] => 4294967296
[2] => 2147483648
[3] => 4294967296
[4] => 2147483648
[5] =>
)
Вы можете легко суммировать это с помощью
echo array_sum($totalMemory);
который затем даст 12884901888. Чтобы превратить это в килограммы, мега- или гигабайты, разделите на 1024 каждый, например
echo array_sum($totalMemory) / 1024 / 1024 / 1024; // GB
Дополнительные способы командной строки для запроса общего объема оперативной памяти можно найти в
Другой программный путь был бы через COM
:
// connect to WMI
$wmi = new COM('WinMgmts:root/cimv2');
// Query this Computer for Total Physical RAM
$res = $wmi->ExecQuery('Select TotalPhysicalMemory from Win32_ComputerSystem');
// Fetch the first item from the results
$system = $res->ItemIndex(0);
// print the Total Physical RAM
printf(
'Physical Memory: %d MB',
$system->TotalPhysicalMemory / 1024 /1024
);
Подробнее об этом примере COM, пожалуйста, смотрите:
- http://php.net/manual/en/book.com.php
- MSDN: создание строки Moniker
- MSDN: класс Win32_ComputerSystem
Скорее всего, вы можете получить эту информацию из других API-интерфейсов Windows, таких как .NET API., также.
Существует также расширение PECL для этого в Windows:
Согласно документации, он должен возвращать массив, который содержит (среди прочего) ключ с именем total_phys
что соответствует "объему общей физической памяти".
Но поскольку это расширение PECL, вам сначала нужно установить его на свой компьютер.
Это незначительное (и, возможно, более подходящее для SuperUser) отличие, но, поскольку оно появилось для меня в недавней службе Windows, я предоставлю это здесь. Вопрос задается о доступной памяти, а не об общей физической памяти.
exec('wmic OS get FreePhysicalMemory /Value 2>&1', $output, $return);
$memory = substr($output[2],19);
echo $memory;