php5.2.0メモリ管理の改善

1624 ワード

php5.2.0のメモリ管理が大幅に改善され、メモリが解放されない場合があります.
phpスクリプト(mem.php)をテストし、echo N>>とsleepでスクリプトをある段階で一時停止して状態を検出するように制御します.
 
  
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このプロセスは、3つの状態(配列作成前、配列作成後、配列破棄後)で、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新しいものがいくつか追加されましたが、これは普通です.
またphp 5.2.0のメモリ割り当ても大幅に改善され、公式にはmemory_Limitの検出はemalloc()を呼び出すたびに行われるが,システムから要求されたメモリデータブロックを直接検出するように変更される.(blocks).より詳しいことが必要な方は、自分でコードを検討することができます.メモリ割り当ての変更により、メモリ制御はmemory_limitの下により正確に制御できます.つまり、以前のphpコードでは、memory_limitを超えたメモリ使用でエラーがなかった場合、php 5.2.0でエラーが報告される可能性があります.今回の改善をバランスさせるために、PHP 5.2.0のデフォルトのmemory_limitは以前の8 MBから16 MBに変更された.検索ソースコードには、この変更(find.-name*c-type f|xargs cat|grep memory_limit)が表示されます.