2011-08-30 9 views
9

Utilizzando PHP, mi piacerebbe ottenere la memoria totale disponibile per il sistema (non solo la memoria libera o utilizzata).Ottieni la memoria di sistema totale disponibile con PHP su Windows

Su Linux è abbastanza semplice. Si può fare:

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

e quindi analizzare il file.

Qualcuno è a conoscenza di un metodo equivalente per Windows? Sono aperto a qualsiasi suggerimento.

Edit: abbiamo una soluzione (ma StackOverflow non mi permette di rispondere alla mia domanda):

exec('systeminfo', $output); 

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

non la soluzione più elegante, ed è molto lento, ma si adatta al mio bisogno.

+0

http://stackoverflow.com/questions/1455379/get-server-ram-with-php – moonwave99

+5

nota laterale: PHP ha una incorporata limite di memoria, quindi la dimensione RAM della macchina non è necessariamente la RAM disponibile per il tuo script (a meno che tu non disabiliti il ​​limite di memoria) – Gordon

+0

systeminfo è orribilmente lento - probabilmente non è una buona idea se lo script ha l'interazione dell'utente – andig

risposta

5

È possibile farlo tramite exec:

exec('wmic memorychip get capacity', $totalMemory); 
print_r($totalMemory); 

questo stampa (sulla mia macchina con 2x2 e 2x4 mattoni di RAM):

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

si può facilmente riassumere questo utilizzando

echo array_sum($totalMemory); 

che fornirà quindi 12884901888. Per trasformarlo in Kilo-, Mega- o Gigabyte, dividere b y 1024 ciascuno, ad es.

echo array_sum($totalMemory)/1024/1024/1024; // GB 

riga di comando Ulteriori modalità di interrogazione RAM totale possono essere trovati in


Un altro modo programmatico sarebbe attraverso 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 
); 

Per i dettagli su questo esempio COM, vedere:

si può probabilmente ottenere queste informazioni da altre API di Windows, come il .NET API., come pure .


C'è anche estensione PECL per fare questo su Windows:

Secondo la documentazione, si deve restituire un array che contiene (tra gli altri) una chiave denominata total_phys che corrisponde a "La quantità di memoria fisica totale"

Ma poiché si tratta di un'estensione PECL, devi prima installarlo sul tuo computer.

2

Questa è una distinzione minore (e possibilmente più adatta per SuperUser), ma come mi è venuta in mente in un recente servizio di Windows, la fornirò qui. La domanda richiede disponibile memoria, non memoria fisica totale.

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

echo $memory; 
Problemi correlati