Få total tilgængelig systemhukommelse med PHP på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Ved hjælp af PHP, vil jeg gerne få den samlede hukommelse tilgængelig for systemet (ikke kun den frie eller brugte hukommelse).


På Linux er det ret lige frem. Du kan gøre:


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


og parser derefter filen.


Er nogen opmærksom på en tilsvarende metode til Windows? Jeg er åben for eventuelle forslag.


Rediger: Vi har en løsning (men StackOverflow vandt 't lad mig svare på mit eget spørgsmål):


exec( 'systeminfo', $output );

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


Ikke den mest elegante løsning, og det er meget langsomt, men det passer til mit behov.

Bedste reference


Du kan gøre dette via exec:


exec('wmic memorychip get capacity', $totalMemory);
print\_r($totalMemory);


Dette vil udskrive (på min maskine, der har 2x2 og 2x4 mursten af ​​RAM):


Array
(
    [0] => Capacity
    [1] => 4294967296
    [2] => 2147483648
    [3] => 4294967296
    [4] => 2147483648
    [5] =>
)


Du kan nemt opsummere dette ved at bruge


echo array\_sum($totalMemory);


som derefter vil give 12884901888. For at omdanne dette til Kilo-, Mega- eller Gigabytes divideres hver 1024, f.eks.


echo array\_sum($totalMemory) / 1024 / 1024 / 1024; // GB


Yderligere kommandolinje måder at forespørge samlet RAM kan findes i



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






En anden programmatisk måde ville være gennem COM: [12]


// 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 detaljer om dette COM-eksempel, se venligst:



  • http://php.net/manual/en/book.com.php

  • MSDN: Konstruktion af en Moniker String

  • MSDN: Win32\_ComputerSystem klasse



Du kan sandsynligvis få disse oplysninger fra andre Windows API'er, som f.eks. .NET API. [13] [14] [15] [16]





Der er også PECL-udvidelse til at gøre dette på Windows:



  • win32\_ps\_stat\_mem - Henter statistikker om den globale hukommelsesudnyttelse.



Ifølge dokumentationen skal den returnere en matrix, der blandt andet indeholder en nøgle med navnet total\_phys, som svarer til ' Mængden af ​​den totale fysiske hukommelse. ' [17]


Men da det er en PECL-udvidelse, skal du først installere den på din maskine.

Andre referencer 1


Dette er en mindre (og muligvis mere egnet til SuperUser) sondring, men som det kommer op for mig i en nylig windows service, vil jeg give det her. Spørgsmålet spørger om ledig hukommelse, ikke total fysisk hukommelse.


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

echo $memory;