3

現在、常に OutOfMemory 例外が発生するスクリプトをデバッグしています。これは cronjob として実行され、通常は正常に動作しますが、cronjob がしばらく実行されなかった場合 (何らかの理由で)、スクリプトはキューに入っている多くの要素を処理する必要があり、OutOfMemory 例外が発生します。

コードを調べても、問題を特定できませんでした。反復関数呼び出しの 1 つがメモリをリークする可能性があると思いますが、どれがどこであるかはわかりません。OutOfMemory 例外が発生したときに PHP にヒープをダンプさせるオプションはありますか? そこから問題を見つけることができるかもしれません (ほとんどの場合)。

4

6 に答える 6

5

「例外でヒープをダンプする」オプションを見つけることができませんでしたがget_defined_vars()、グローバルスコープから呼び出された場合、基本的にヒープダンプであることがわかりました。これを使用して、数百 (実際には数千) のまだ参照されているデータベース行が私の記憶にぶら下がっていることを確認できました。これは、リークの原因となった悪名高い関数のどこかで解放されていない mysql 結果リソースが原因でした。私はそれを見つけて修正しました。今はうまくいきます。

于 2010-11-10T10:24:16.023 に答える
1

最も簡単な方法は、エラーが発生する可能性のあるスクリプトの部分で try-catch ブロックを使用することです。catch 部分でスタックをダンプする必要があります。問題は、メモリがいっぱいになり、マシンが終了するためにマシンが反応できなくなることです。一部の変数を破棄して一部のメモリを解放して一部のデータを出力するのに役立つかどうかはわかりません。

編集: この目的のために、php 関数debug-backtraceを使用します。これにより、スタック トレースが得られます。したがって、マシンがまだ稼働している場合は、エラーが見つかる可能性が高くなります。

于 2010-10-25T12:01:20.930 に答える
0

すべてのオブジェクトを一緒にメモリにロードするのではなく、処理しながら読み取るのですか?

于 2010-10-25T12:10:18.317 に答える
0

PHP がこれにネイティブな機能を提供するのを見たことはありませんが、他にもいくつかの機能が存在する可能性があります。

試してください: https://github.com/mcfunley/php-heap/blob/master/php-heap.py

同じことを実現する拡張機能を作成することもできます。

于 2015-04-26T19:43:13.650 に答える
0

私は、simpleXML とメモリ リークで多くの問題を抱えてきました。それらを追跡するのは面倒です... simpleXMLが原因であることがわかり、修正するのに数日かかりました。私の知る限り、プログラムでOOMのハンドルを設定できます:)

また、メモリ情報を表示するための PHP の関数はメモリ リークを検出できませんでした。スクリプトが ~1Gb の RAM を消費していましたが、PHP の関数は 100Mb しか使用されていないと報告しました:)

于 2010-10-25T13:10:23.203 に答える