9

私は約2時間実行されるphpスクリプトを持っています。これはcronジョブです。cronジョブは4時間ごとに実行されます。

スクリプトの最後に、いくつかのメモリ値を表示します。

The memory_get_usage() result is 881568 Bytes (0.840766906738M)
The memory_get_peak_usage() result is 1340304 Bytes (1.27821350098M)
The memory_get_usage(true) result is 1572864 Bytes (1.5M)
The memory_get_peak_usage(true) result is 1835008 Bytes (1.75M)

php.iniのmemory_limitは128Mで、機能しませんでした。256Mに上げると、動作します。

ただし、スクリプトのメモリのピークは2M未満であるため、...

では、memory_limitパラメーターはどのように機能しますか?

スクリプトで使用されているメモリの合計ですか?もしそうなら、どうすればそれを計算できますか?

スクリプトのメモリピークですか?もしそうなら、私はそれを正しく計算していますか?

私はphp5.3.16を使用しています。

編集

エラーメッセージはありません。制限が128Mの場合スクリプトは実行されますが、終了することはありません。

4

1 に答える 1

3

ご使用のオペレーティングシステムを使用して、このような実際のメモリを報告する機能を使用してみてください。

function unix_get_usage() { 
      $pid = getmypid(); 
      exec("ps -o rss -p $pid", $output); 
      return $output[1] *1024; 
 }

function windows_get_usage(){
    $output = array();
    exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST', $output );
    return preg_replace( '/[^0-9]/', '', $output[5] ) * 1024;
}

スクリプトはおそらく、memory_get_usage()(ヒープbtwを調べます)から戻るときにPHPが考慮しない大量のメモリを消費します。スタックに割り当てられた変数は、memory_get_usage()が呼び出されて返されるまでにクリアされていたはずです。

また、実行中の他の時点、たとえば大きなMySQL呼び出しやファイル処理の後などに、この関数や他の関数を実行してみてください。memory_get_peak_usage()は、特にコンパイルオプションによっては、すべてのOSで機能するとは限りません。

于 2012-09-06T15:21:37.200 に答える