php5.2.0內(nèi)存管理改進(jìn)
更新時間:2007年01月22日 00:00:00 作者:
php5.2.0的內(nèi)存管理做了較大的改進(jìn),某些情況下內(nèi)存不能釋放的問題不存在了。
測試php腳本(mem.php),我用echo N>>和sleep來控制腳本在某個階段暫停以便檢測狀態(tài)。
<?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);
}
?>
監(jiān)測內(nèi)存使用情況的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這個進(jìn)程在三種狀態(tài)(數(shù)組創(chuàng)建前,數(shù)組創(chuàng)建后,數(shù)組銷毀后)下,用5.1.6和5.2.0的PHP(我使用了一樣的configure參數(shù))測試的RSS(內(nèi)存使用值,單位KB)結(jié)果。
php5.1.6:
3164
18076
17572
PHP5.2.0:
4088
14400
4424
大家可以看到5.1.6這個版本,unset數(shù)組之后,內(nèi)存并沒有從進(jìn)程里釋放出來,雖然它是可以繼續(xù)被這個php進(jìn)程再利用,但是卻無法被系統(tǒng)的其他進(jìn)程所使用。而5.2.0則真正釋放出了內(nèi)存。
大家可能還注意到,在最開始,5.2.0的內(nèi)存使用比5.1.6多了幾個kb,這是由于5.2.0增加了一些新的東西,這個是很正常的。
另外php5.2.0的內(nèi)存分配也進(jìn)行了大的改進(jìn),官方的說法是對memory_limit的檢測由每次呼叫emalloc()的時候進(jìn)行改為直接檢測從系統(tǒng)請求的內(nèi)存數(shù)據(jù)塊(blocks)。需要更進(jìn)一步了解的朋友可以自己去研究代碼。而由于內(nèi)存分配的實(shí)現(xiàn)的更改,內(nèi)存控制可以更精確地被控制在memory_limit之下,也就是說以前php代碼里,如果有超過了memory_limit的內(nèi)存使用而沒有出錯的,在php5.2.0里可能會報錯。為了平衡這次改進(jìn),PHP5.2.0的默認(rèn)的memory_limit由以前的8MB改為了16MB.搜索源代碼可以看到這個修改(find . -name \*c -type f |xargs cat |grep memory_limit)。
測試php腳本(mem.php),我用echo N>>和sleep來控制腳本在某個階段暫停以便檢測狀態(tài)。
復(fù)制代碼 代碼如下:
<?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);
}
?>
while true;do clear;ps au|grep -v "\(vi\|grep\)"|grep "\(mem\|RSS\)";sleep 2;done;
以下是$/usr/local/bin/php mem.php這個進(jìn)程在三種狀態(tài)(數(shù)組創(chuàng)建前,數(shù)組創(chuàng)建后,數(shù)組銷毀后)下,用5.1.6和5.2.0的PHP(我使用了一樣的configure參數(shù))測試的RSS(內(nèi)存使用值,單位KB)結(jié)果。
php5.1.6:
3164
18076
17572
PHP5.2.0:
4088
14400
4424
大家可以看到5.1.6這個版本,unset數(shù)組之后,內(nèi)存并沒有從進(jìn)程里釋放出來,雖然它是可以繼續(xù)被這個php進(jìn)程再利用,但是卻無法被系統(tǒng)的其他進(jìn)程所使用。而5.2.0則真正釋放出了內(nèi)存。
大家可能還注意到,在最開始,5.2.0的內(nèi)存使用比5.1.6多了幾個kb,這是由于5.2.0增加了一些新的東西,這個是很正常的。
另外php5.2.0的內(nèi)存分配也進(jìn)行了大的改進(jìn),官方的說法是對memory_limit的檢測由每次呼叫emalloc()的時候進(jìn)行改為直接檢測從系統(tǒng)請求的內(nèi)存數(shù)據(jù)塊(blocks)。需要更進(jìn)一步了解的朋友可以自己去研究代碼。而由于內(nèi)存分配的實(shí)現(xiàn)的更改,內(nèi)存控制可以更精確地被控制在memory_limit之下,也就是說以前php代碼里,如果有超過了memory_limit的內(nèi)存使用而沒有出錯的,在php5.2.0里可能會報錯。為了平衡這次改進(jìn),PHP5.2.0的默認(rèn)的memory_limit由以前的8MB改為了16MB.搜索源代碼可以看到這個修改(find . -name \*c -type f |xargs cat |grep memory_limit)。
相關(guān)文章
詳解WordPress中創(chuàng)建和添加過濾器的相關(guān)PHP函數(shù)
這篇文章主要介紹了WordPress中創(chuàng)建和添加過濾器的相關(guān)PHP函數(shù),分別是apply_filters()函數(shù)和add_filter()函數(shù)的使用,需要的朋友可以參考下2015-12-12
PHP實(shí)現(xiàn)的簡單AES加密解密算法實(shí)例
這篇文章主要介紹了PHP實(shí)現(xiàn)的簡單AES加密解密算法,結(jié)合具體實(shí)例形式分析了php基于mcrypt_encrypt、bin2hex、mcrypt_decrypt等方法進(jìn)行字符串加密解密的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
PHP平滑關(guān)閉/重啟的實(shí)現(xiàn)方法
"平滑重啟"和"快速重啟"是兩種不同的概念,下面這篇文章主要給大家介紹了關(guān)于PHP平滑關(guān)閉/重啟的實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
php魔術(shù)函數(shù)__call()用法實(shí)例分析
這篇文章主要介紹了php魔術(shù)函數(shù)__call()用法,實(shí)例分析了__call()函數(shù)的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02

