Zjištění zabrané paměti php skriptem ve Windows

Příkaz memory_get_usage() ve windows byl do verze PHP 5.2.5 problém. Tady je možnost jak vypsat velikost zabrané paměťi ve windows i ve starších verzích PHP.


Zdrojový kód ke stažení memory_get_usage.php.txtUkázky k nahlédnutí memory_get_usage.php.

Při práci s rozsáhlými datovými bloky je funkce pro zjištění zabrané paměti nedocenitelná. Zvlášť pro ladění aplikace. Osobně jsem narazil na problémy se zpracováním xml a s rušením referencí na objekty. Nejsem si jist jak je to v posledních verzích php, ale dříve jsem u php pozoroval zajímavé chování, kdy přetekl nepochopitelně zásobník.

Problém je pokud vyvíjíte své skripty na stroji, kde běží Windows. Do verze PHP 5.2.5 nebyl funkční příkaz memory_get_usage(), od verze 5.2.5 již můžeme používat tuto funkci stejně jako na linuxu.

Pokud máte starší verzi funkci definujte takto (testováno na WINDOWS XP/Apache >2):

  1. /*
  2. na tomto místě by bylo lepší použít
  3. if (!function_exists('memory_get_usage')) {
  4. function memory_get_usage() {
  5. ... a definovat funkci pro použití ve windows, použil jsem jiný název, abych mohl porovnat výstupy obou funkcí
  6. */
  7. function getMemUsage() {
  8. $output = array();
  9. @exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST', $output);
  10. $a = $output[3];
  11. $m = explode(" ",trim($a));
  12. return round(preg_replace('/[D]/', '', $m[count($m)-2])*1024, 5);
  13. }

Výsledek je vracen v kB, proto násobím hodnotou 1024. Velikost zabrané paměti najdete v poli na pozici 3, ve většině verzí PHP a Apache jsem paměť našel na této pozici, ale jiné zdroje uvádějí pozici 8 ($a = $output[8];). Stačí si výsledné pole vypsat a zjistíte, kde se náchází správný řádek. Paměť je uvedena až na konci řádku, takže musíme odstranit všechny nechtěné znaky.

Funkci jsem testoval ve dvouch verzích PHP, výsledek pro PHP 4.4.7:

  1. OS: Windows_NT
  2. Current PHP version: 4.4.7
  3. Server signature:
  4. Apache/2.2.6 (Win32) DAV/2 mod_ssl/2.2.6 OpenSSL/0.9.8g mod_autoindex_color PHP/4.4.7 Server at web.www.webfaq.cz Port 80
  5.  
  6. Server software: Apache/2.2.6 (Win32) DAV/2 mod_ssl/2.2.6 OpenSSL/0.9.8g mod_autoindex_color PHP/4.4.7
  7.  
  8. Before alocate WINDOWS get_memory_usage - 19.734375 MB.
  9. After alocate 5MB of memory WINDOWS get_memory_usage - 24.7578125 MB.

A výsledek pro PHP 5.2.5:

  1. OS: Windows_NT
  2. Current PHP version: 5.2.5
  3. Server signature:
  4. Apache/2.2.6 (Win32) DAV/2 mod_ssl/2.2.6 OpenSSL/0.9.8g mod_autoindex_color PHP/5.2.5 Server at web.www.webfaq.cz Port 80
  5.  
  6. Server software: Apache/2.2.6 (Win32) DAV/2 mod_ssl/2.2.6 OpenSSL/0.9.8g mod_autoindex_color PHP/5.2.5
  7.  
  8. Before alocate WINDOWS get_memory_usage - 24.6796875 MB.
  9. Before alocate LINUX get_memory_usage - 0.0766906738281 MB.
  10. After alocate 5MB of memory WINDOWS get_memory_usage - 29.71875 MB.
  11. After alocate 5MB of memory LINUX get_memory_usage - 5.0767288208 MB.

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>