php5.2.0的內存管理做了較大的改進,某些情況下內存不能釋放的問題不存在了。
測試php腳本(mem.php),我用echo N>>和sleep來控制腳本在某個階段暫停以便檢測狀態。
復制代碼 代碼如下:
<?php
echo '1>>';
sleep(5);
$o = array();
for ($i=0;$i<=100000;$i++) {
$o[]='aaaaaaaaaaaaaaaaaaaaa';
}
echo '2>>';
sleep(5);
unset($o);
echo '3>>';
while (true) {
echo '..';
sleep(10);
}
?>
監測內存使用情況的bash script(注意:裡面的”mem”是取自上面的php腳本名):
while true;do clear;ps au|grep -v "\(vi\|grep\)"|grep "\(mem\|RSS\)";sleep 2;done;
以下是$/usr/local/bin/php mem.php這個進程在三種狀態(數組創建前,數組創建後,數組銷毀後)下,用5.1.6和5.2.0的PHP(我使用了一樣的configure參數)測試的RSS(內存使用值,單位KB)結果。
php5.1.6:
3164
18076
17572
PHP5.2.0:
4088
14400
4424
大家可以看到5.1.6這個版本,unset數組之後,內存並沒有從進程裡釋放出來,雖然它是可以繼續被這個php進程再利用,但是卻無法被系統的其他進程所使用。而5.2.0則真正釋放出了內存。
大家可能還注意到,在最開始,5.2.0的內存使用比5.1.6多了幾個kb,這是由於5.2.0增加了一些新的東西,這個是很正常的。
另外php5.2.0的內存分配也進行了大的改進,官方的說法是對memory_limit的檢測由每次呼叫emalloc()的時候進行改為直接檢測從系統請求的內存數據塊(blocks)。需要更進一步了解的朋友可以自己去研究代碼。而由於內存分配的實現的更改,內存控制可以更精確地被控制在memory_limit之下,也就是說以前php代碼裡,如果有超過了memory_limit的內存使用而沒有出錯的,在php5.2.0裡可能會報錯。為了平衡這次改進,PHP5.2.0的默認的memory_limit由以前的8MB改為了16MB.搜索源代碼可以看到這個修改(find . -name \*c -type f |xargs cat |grep memory_limit)。