PHP 的變數 何時做記憶體釋放

PHP 變數 assign 很大的值,會直接吃掉不少記憶體,此變數使用後,要釋放掉這些記憶體,可以使用 unset() 或者設為空、null 等等。

雖然手動清空變數的記憶體,不過通常程式都不會立即釋放出來,在 PHP 的情況是怎麼樣呢?

  • 註:此篇測試環境是 Linux + PHP 7.0

PHP 的變數 何時做記憶體釋放

想要知道何時釋放記憶體,可以來做個小實驗,使用 PHP 查看記憶體使用量的函式memory_get_usage() 來試試看。

  • 註:實際從系統外部 ps 查看記憶體使用量的部份,可自行使用 sleep + ps 查看

下述分別使用 unset()、null、''、function 等等做測試,程式碼如下:(程式碼註解那區塊是強制釋放系統記憶體,有興趣的可以自行打開玩玩看~)

  1. <?php
  2. echo "Init 1:\n";
  3. $x = str_repeat('x', 80000);
  4. echo memory_get_usage() . " - begin\n";
  5. echo "Unset:\n";
  6. unset($x);
  7. echo memory_get_usage() . " - end\n\n";
  8. echo "Init 2:\n";
  9. $x = str_repeat('x', 80000);
  10. echo memory_get_usage() . " - begin\n";
  11. echo "Null:\n";
  12. $x = null;
  13. echo memory_get_usage() . " - end\n\n";
  14. echo "Init 3:\n";
  15. $x = str_repeat('x', 80000);
  16. echo memory_get_usage() . " - begin\n";
  17. echo "Space:\n";
  18. $x = '';
  19. echo memory_get_usage() . " - end\n\n";
  20. /*
  21. sleep(1);
  22. system('echo 1 > /proc/sys/vm/drop_caches');
  23. system('echo 2 > /proc/sys/vm/drop_caches');
  24. system('echo 3 > /proc/sys/vm/drop_caches');
  25. sleep(3);
  26. echo memory_get_usage(true) . "\n";
  27. */
  28. echo "Function:\n";
  29. function test() {
  30. echo "Init 4:\n";
  31. echo memory_get_usage() . " - begin\n";
  32. $x = str_repeat('x', 80000);
  33. echo memory_get_usage() . " - function end\n";
  34. }
  35. test();
  36. echo memory_get_usage() . " - end\n\n";
  37. echo "Reasign:\n";
  38. $x = str_repeat('x', 80000);
  39. echo memory_get_usage() . " - begin\n";
  40. $x = null;
  41. echo memory_get_usage() . " - end\n";
  42. echo memory_get_peak_usage() . " - memory peak\n";
  43. ?>

測試結果

Init 1:
437712 - begin
Unset:
355792 - end

Init 2:
437712 - begin
Null:
355792 - end

Init 3:
437712 - begin
Space:
355792 - end

Function:
Init 4:
355792 - begin
437712 - function end
355792 - end

Reasign:
437712 - begin
355792 - end
437792 - memory peak

看起來記憶體都是立即釋放~

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料