2009-04-21 6 views
1

だから私は非常に奇妙な問題があります。PHPがメモリ制限に達すると関数が再実行する

まず、私はPHP 5.2.6を使用しています(これはMAMPの一部ですが、これは5.2.6を実行しているLAMPサーバーでも発生します)。Zend Framework 1.7.2を使用してWebサイトを作成します。

第2に、私が書いているソフトウェアは、かなり複雑な統計計算を行い、多くのメモリを必要とします。通常、128MBがメモリ制限として設定されて正常に動作します。

ここは楽しい部分です。

私は、必要なデータを取得し、必要な計算を行い、次に値を返す責任を負うクラスを持っています。 PHPが実行された後、私はPHPをスコープに入れて、それが呼び出された関数を終了してもメモリを保持していると思うように見えます(これは計算の2回目の実行が問題になっていました記憶限界に達し、スクリプトが死んだ)。この計算がその関数内で一度実行されると、別の関数で再度実行され、別の計算が実行されます(これは同じ実行の実行中です)。物事が奇妙になるところです。

2番目の計算を実行すると、この計算を実行するコード内からその関数への呼び出しが全くないのに、呼び出し元関数が再び実行されます。また、PHPにエラーや警告は表示されません。

しかし、メモリの上限(たとえば1024 MB)を増やすと、は発生しません。全体的な呼び出し関数は一度実行され、そのメリー・ウェイに沿って続けられます。

だから、私は下の地図を描いてみましょう。メモリ128 MBの

function A{ 
    calls function B 
    calls function D 
} 

function B{ 
    calls calculation function C 
} 

function D{ 
    calls calculation function C 
} 

、次のように関数の経路である(および呼び出し元へ): A-> B-> C-> B-> A-> D-> C-> D->次に何らかの理由で関数の先頭からAを実行します(この実行パスの間に条件が成立するため、パスは繰り返されません)

1GBのメモリ関数のパスは次のようになります。 A-> B-> C-> B-> A-> D-> C-> D-> Aの終わりです。

関数Dから2番目の計算を削除しても機能します。メモリの上限を超えていれば動作します。

質問:私はPHPのメモリ管理にバグを発見しましたか?あるいは、おそらくZend Frameworkで?再び; php.iniのスクリプトごとのメモリ制限を増やすことで、私はこの問題を認識しません。それは、または多くのメモリを使用するこの計算を実行する2番目のインスタンスを削除します。

私は非常に、これが起こる方法であることを確信しています(私はこのような種類の呼び出し元関数へのジャンプを見たことはありません)。通常、この場合、PHPはエラーが発生して終了し、呼び出し関数を再起動しません。

+1

あなたのPHPエラー報告はどのように設定されていますか?警告やエラーが表示されない場合は、あまりにも低く設定されている可能性があります。あなたが何かを手に入れなければならないようです。 E_ALLとE_STRICTをオンにして、それがあなたにもっと何かを伝えるかどうか確認してください。 –

+0

実際、私たちはもっと何かを得ています。 Out-of-Memoryエラーが発生しました。奇妙なことに、私はときどきOOMエラーを受けていましたが、今は毎回1つしかありません。 これで、致命的なPHPエラーが、エラーが発生した場所で関数を呼び出した関数を再実行するという興味深い問題が発生しました。これは適切な行動ですか?致命的なエラーでPHPが死んではいけませんか? – jedcred

+0

私は不思議です:原因は何ですか? – soulmerge

答えて

0

まず、すべてerror reporting(E_STRICTを含む)をオンにします。

メモリが不足しているため、期待していない実行パスが発生する可能性があります。追加のエラー出力が発生する可能性があります。

+0

質問のコメントを参照してください。 – jedcred

1

debug_backtrace()を使用してプログラムフローを確認しましたか?私はあなたのPHPコードがzendエンジンよりもこの原因である可能性が高いと考えています。トレースのダンプを各関数の先頭にファイルに入れて、最初に解析することをお勧めします。

+0

そのショットを与えるでしょう。 – jedcred

関連する問題