PHP 變數 assign 很大的值,會直接吃掉不少記憶體,此變數使用後,要釋放掉這些記憶體,可以使用 unset() 或者設為空、null 等等。
雖然手動清空變數的記憶體,不過通常程式都不會立即釋放出來,在 PHP 的情況是怎麼樣呢?
- 註:此篇測試環境是 Linux + PHP 7.0
PHP 的變數 何時做記憶體釋放
想要知道何時釋放記憶體,可以來做個小實驗,使用 PHP 查看記憶體使用量的函式memory_get_usage() 來試試看。
- 註:實際從系統外部 ps 查看記憶體使用量的部份,可自行使用 sleep + ps 查看
下述分別使用 unset()、null、''、function 等等做測試,程式碼如下:(程式碼註解那區塊是強制釋放系統記憶體,有興趣的可以自行打開玩玩看~)
<?php echo "Init 1:\n"; $x = str_repeat('x', 80000); echo memory_get_usage() . " - begin\n"; echo "Unset:\n"; unset($x); echo memory_get_usage() . " - end\n\n"; echo "Init 2:\n"; $x = str_repeat('x', 80000); echo memory_get_usage() . " - begin\n"; echo "Null:\n"; $x = null; echo memory_get_usage() . " - end\n\n"; echo "Init 3:\n"; $x = str_repeat('x', 80000); echo memory_get_usage() . " - begin\n"; echo "Space:\n"; $x = ''; echo memory_get_usage() . " - end\n\n"; /* sleep(1); system('echo 1 > /proc/sys/vm/drop_caches'); system('echo 2 > /proc/sys/vm/drop_caches'); system('echo 3 > /proc/sys/vm/drop_caches'); sleep(3); echo memory_get_usage(true) . "\n"; */ echo "Function:\n"; function test() { echo "Init 4:\n"; echo memory_get_usage() . " - begin\n"; $x = str_repeat('x', 80000); echo memory_get_usage() . " - function end\n"; } test(); echo memory_get_usage() . " - end\n\n"; echo "Reasign:\n"; $x = str_repeat('x', 80000); echo memory_get_usage() . " - begin\n"; $x = null; echo memory_get_usage() . " - end\n"; echo memory_get_peak_usage() . " - memory peak\n"; ?>
測試結果
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
看起來記憶體都是立即釋放~