php5.2.0內(nèi)存管理改進(jìn)
更新時(shí)間:2007年01月22日 00:00:00 作者:
php5.2.0的內(nèi)存管理做了較大的改進(jìn),某些情況下內(nèi)存不能釋放的問(wèn)題不存在了。
測(cè)試php腳本(mem.php),我用echo N>>和sleep來(lái)控制腳本在某個(gè)階段暫停以便檢測(cè)狀態(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)測(cè)內(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這個(gè)進(jìn)程在三種狀態(tài)(數(shù)組創(chuàng)建前,數(shù)組創(chuàng)建后,數(shù)組銷毀后)下,用5.1.6和5.2.0的PHP(我使用了一樣的configure參數(shù))測(cè)試的RSS(內(nèi)存使用值,單位KB)結(jié)果。
php5.1.6:
3164
18076
17572
PHP5.2.0:
4088
14400
4424
大家可以看到5.1.6這個(gè)版本,unset數(shù)組之后,內(nèi)存并沒(méi)有從進(jìn)程里釋放出來(lái),雖然它是可以繼續(xù)被這個(gè)php進(jìn)程再利用,但是卻無(wú)法被系統(tǒng)的其他進(jìn)程所使用。而5.2.0則真正釋放出了內(nèi)存。
大家可能還注意到,在最開(kāi)始,5.2.0的內(nèi)存使用比5.1.6多了幾個(gè)kb,這是由于5.2.0增加了一些新的東西,這個(gè)是很正常的。
另外php5.2.0的內(nèi)存分配也進(jìn)行了大的改進(jìn),官方的說(shuō)法是對(duì)memory_limit的檢測(cè)由每次呼叫emalloc()的時(shí)候進(jìn)行改為直接檢測(cè)從系統(tǒng)請(qǐng)求的內(nèi)存數(shù)據(jù)塊(blocks)。需要更進(jìn)一步了解的朋友可以自己去研究代碼。而由于內(nèi)存分配的實(shí)現(xiàn)的更改,內(nèi)存控制可以更精確地被控制在memory_limit之下,也就是說(shuō)以前php代碼里,如果有超過(guò)了memory_limit的內(nèi)存使用而沒(méi)有出錯(cuò)的,在php5.2.0里可能會(huì)報(bào)錯(cuò)。為了平衡這次改進(jìn),PHP5.2.0的默認(rèn)的memory_limit由以前的8MB改為了16MB.搜索源代碼可以看到這個(gè)修改(find . -name \*c -type f |xargs cat |grep memory_limit)。
測(cè)試php腳本(mem.php),我用echo N>>和sleep來(lái)控制腳本在某個(gè)階段暫停以便檢測(cè)狀態(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這個(gè)進(jìn)程在三種狀態(tài)(數(shù)組創(chuàng)建前,數(shù)組創(chuàng)建后,數(shù)組銷毀后)下,用5.1.6和5.2.0的PHP(我使用了一樣的configure參數(shù))測(cè)試的RSS(內(nèi)存使用值,單位KB)結(jié)果。
php5.1.6:
3164
18076
17572
PHP5.2.0:
4088
14400
4424
大家可以看到5.1.6這個(gè)版本,unset數(shù)組之后,內(nèi)存并沒(méi)有從進(jìn)程里釋放出來(lái),雖然它是可以繼續(xù)被這個(gè)php進(jìn)程再利用,但是卻無(wú)法被系統(tǒng)的其他進(jìn)程所使用。而5.2.0則真正釋放出了內(nèi)存。
大家可能還注意到,在最開(kāi)始,5.2.0的內(nèi)存使用比5.1.6多了幾個(gè)kb,這是由于5.2.0增加了一些新的東西,這個(gè)是很正常的。
另外php5.2.0的內(nèi)存分配也進(jìn)行了大的改進(jìn),官方的說(shuō)法是對(duì)memory_limit的檢測(cè)由每次呼叫emalloc()的時(shí)候進(jìn)行改為直接檢測(cè)從系統(tǒng)請(qǐng)求的內(nèi)存數(shù)據(jù)塊(blocks)。需要更進(jìn)一步了解的朋友可以自己去研究代碼。而由于內(nèi)存分配的實(shí)現(xiàn)的更改,內(nèi)存控制可以更精確地被控制在memory_limit之下,也就是說(shuō)以前php代碼里,如果有超過(guò)了memory_limit的內(nèi)存使用而沒(méi)有出錯(cuò)的,在php5.2.0里可能會(huì)報(bào)錯(cuò)。為了平衡這次改進(jìn),PHP5.2.0的默認(rèn)的memory_limit由以前的8MB改為了16MB.搜索源代碼可以看到這個(gè)修改(find . -name \*c -type f |xargs cat |grep memory_limit)。
相關(guān)文章
PHP實(shí)現(xiàn)獲取并生成數(shù)據(jù)庫(kù)字典的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)獲取并生成數(shù)據(jù)庫(kù)字典的方法,可實(shí)現(xiàn)讀取數(shù)據(jù)庫(kù)并列出詳細(xì)數(shù)據(jù)庫(kù)信息的功能,需要的朋友可以參考下2016-05-05
PHP工廠模式Factory Pattern的實(shí)現(xiàn)及特點(diǎn)
工廠模式,是一種實(shí)例化對(duì)象的方式,只要輸入需要實(shí)例化對(duì)象的名字,就可以通過(guò)工廠對(duì)象的相應(yīng)工廠函數(shù)來(lái)制造你需要的對(duì)象,工廠模式的最主要作用就是對(duì)象創(chuàng)建的封裝、簡(jiǎn)化創(chuàng)建對(duì)象操作2023-03-03
php打開(kāi)本地exe程序,js打開(kāi)本地exe應(yīng)用程序,并傳遞相關(guān)參數(shù)方法
下面小編就為大家分享一篇php打開(kāi)本地exe程序,js打開(kāi)本地exe應(yīng)用程序,并傳遞相關(guān)參數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
PHP管理依賴(dependency)關(guān)系工具 Composer 安裝與使用
Composer 是PHP中用來(lái)管理依賴(dependency)關(guān)系的工具。你可以在自己的項(xiàng)目中聲明所依賴的外部工具庫(kù)(libraries),Composer會(huì)幫你安裝這些依賴的庫(kù)文件。2014-08-08
PHP提示Notice: Undefined variable的解決辦法
今天在調(diào)試程序的時(shí)候,很多網(wǎng)上提供的源碼都會(huì)出現(xiàn) Undefined variable錯(cuò)誤,一般情況下php是不需要定義變量的,但如果服務(wù)器什么都報(bào)錯(cuò)的,就會(huì)出現(xiàn)錯(cuò)誤,所以服務(wù)器上都是應(yīng)該屏蔽這種錯(cuò)誤的2012-11-11

