在Windows上使用PHP获取系统总可用内存

11

使用PHP,我想获取系统可用的总内存(不仅仅是空闲或已使用的内存)。

在Linux上很容易。您可以执行以下操作:

$memory = fopen('/proc/meminfo');

然后解析文件。

有人知道Windows的等效方法吗?我对任何建议都持开放态度。

编辑:我们有一个解决方案(但StackOverflow不允许我回答自己的问题):

exec( 'systeminfo', $output );

foreach ( $output as $value ) {
    if ( preg_match( '|Total Physical Memory\:([^$]+)|', $value, $m ) ) {
        $memory = trim( $m[1] );
}

虽然不是最优雅的解决方案,而且也很慢,但它满足了我的需求。


https://dev59.com/AnM_5IYBdhLWcg3wQQzw - moonwave99
5
注:PHP内置了内存限制,因此机器的RAM大小不一定是您的脚本可用的RAM(除非您禁用了内存限制)。 - Gordon
systeminfo非常慢 - 如果脚本需要用户交互,这可能不是一个好主意。 - andig
2个回答

7
您可以通过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。要将其转换为KB、MB或GB,请每个数值除以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示例的详细信息,请参见:

您还可以从其他Windows API(如.NET API)中获取此信息。


在Windows上还有PECL扩展来完成此操作:

根据文档,它应该返回一个包含(其中之一)名为total_phys的键的数组,该键对应于“总物理内存量。

但是由于它是一个PECL扩展,因此您首先需要在计算机上安装它。


2

这是一个次要的(可能更适合于SuperUser)区别,但由于我最近在Windows服务中遇到了这个问题,所以在这里提供一下。该问题询问的是可用内存,而不是总物理内存。

exec('wmic OS get FreePhysicalMemory /Value 2>&1', $output, $return);
$memory = substr($output[2],19);

echo $memory;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接