Get total available system memory with PHP on Windows

前端 未结 2 534
梦毁少年i
梦毁少年i 2021-02-14 10:53

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:

相关标签:
2条回答
  • 2021-02-14 11:41

    This is a minor (and possibly more suitable for SuperUser) distinction, but as it's come up for me in a recent windows service, I'll provide it here. The question asks about available memory, not total physical memory.

    exec('wmic OS get FreePhysicalMemory /Value 2>&1', $output, $return);
    $memory = substr($output[2],19);
    
    echo $memory;
    
    0 讨论(0)
  • 2021-02-14 11:43

    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

    • https://superuser.com/questions/315195/is-there-a-command-to-find-out-the-available-memory-in-windows

    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:

    • http://php.net/manual/en/book.com.php
    • MSDN: Constructing a Moniker String
    • MSDN: Win32_ComputerSystem class

    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:

    • win32_ps_stat_mem — Retrieves statistics about the global memory utilization.

    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.

    0 讨论(0)
提交回复
热议问题