Using PHP, I'd like to get the total memory available to the system (not just the free or used memory).
On Linux it's quite straight forward. You can do:
$memory = fopen('/proc/meminfo');
and then parse the file.
Is anyone aware of an equivalent method for Windows? I'm open to any suggestions.
Edit: We have a solution (but StackOverflow won't let me answer my own question):
exec( 'systeminfo', $output );
foreach ( $output as $value ) {
if ( preg_match( '|Total Physical Memory\:([^$]+)|', $value, $m ) ) {
$memory = trim( $m[1] );
}
Not the most elegant solution, and it's very slow, but it suits my need.
You can do this via exec
:
exec('wmic memorychip get capacity', $totalMemory);
print_r($totalMemory);
This will print (on my machine having 2x2 and 2x4 bricks of RAM):
Array
(
[0] => Capacity
[1] => 4294967296
[2] => 2147483648
[3] => 4294967296
[4] => 2147483648
[5] =>
)
You can easily sum this by using
echo array_sum($totalMemory);
which will then give 12884901888. To turn this into Kilo-, Mega- or Gigabytes, divide by 1024 each, e.g.
echo array_sum($totalMemory) / 1024 / 1024 / 1024; // GB
Additional command line ways of querying total RAM can be found in
Another programmatic way would be through 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
);
For details on this COM example, please see:
You can likely get this information from other Windows APIs, like the .NET API., as well.
There is also PECL extension to do this on Windows:
According to the documentation, it should return an array which contains (among others) a key named total_phys
which corresponds to "The amount of total physical memory."
But since it's a PECL extension, you'd first have to install it on your machine.