は、私はのようなエラーが出ますので、時々壊すのスクリプトを持っている:memory_get_usage()から取得した値を「ドリルダウン」することはできますか?
PHP Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes) in ...
メモリの制限が低すぎると128Mで入れなかったです。 (それ以上で十分です)
問題は、スクリプトが進むにつれて、より多くのメモリが必要になることです。基本的には、ループはfor
です。私はすべての変数をチェックしましたが、スクリプトが成長する「何か」(たとえば配列)を埋めてスクリプトがより多くのメモリを必要とする理由を説明する場所はありません。
私はmemory_get_usage()
を使用してメモリの問題を確認しました。私は各反復の後にメモリのフットプリントを印刷して、その数は常に高くなっています。
Xdebugを使用しても、この時点で私を助ける兆候はありません。
ドリルダウンできる方法はありますか、ループするたびにさらに多くのメモリが必要ですか?あなたはその状況をデバッグするために何を提案しますか?
残念ながら、PHPのメモリリークを簡単にデバッグする方法はありません。ループの内容を別のメソッドまたは関数に入れてみてください。だからあなたのループ本体は、その関数呼び出し以外何もありません。 IIRC PHPのガベージコレクタは、関数やメソッドの最後に呼び出されます。あなたが持っているものはすべてループなので、GCは呼び出されません。 –
マイク、私はあなたの提案を試みて、それを呼び出すのではなく関数を呼び出すことがメモリに影響を与えることを発見しました。だから私は "問題"がその機能にあることを知っている。つまり、関数にコードを入れて、すべての変数に 'unset(...)'を実行しても、関数を呼び出すたびにメモリはスクリプトを強制終了するまで高くなります。 GCはそれに影響を与えないようです。 – Maxime
Dohは、簡単な解決策を望んでいました。チェックアウトの私の同様の質問..いくつかの答えが役立つかもしれないhttp://stackoverflow.com/questions/849549/finding-cause-of-memory-leaks-in-large-php-stacks –