2017-09-12 1 views
1

私は数ヶ月間、時々メモリ不足を継続的に開発されているアプリケーションで取得しています&についてこれまでの20人のユーザー。メモリ不足のPHPエラーの正確な原因(...それはvar_dump()でした)

私は検出できる否定的な反響はないように見えましたが、最終的には犯人を見つけました。

奇妙なコードが見つかったデフォルトの404エラービューがどのようにあるのかわかりませんが、どうしたのか分かりません。このデフォルト404エラービューは、findOrFail()を使用してdbがレコードを見つけられない場合、フレームワークによって自動的に呼び出されます。私のアプリでページが利用できないとき(あるべきコンテンツが公開/未公開になるため)、このエラービューがトリガされていました。

奇妙なコードがあった。

<!-- <div><?php var_dump($exception); ?></div> --> 
<div class="text">{{$exception->getMessage()}}</div> 

は全く奇妙な私は知っています。

最初に、htmlコメントはブレードファイルなので適用されないため、コメントアウトされていてもvar_dumpが呼び出されていました。

だから私はこれでそれを置き換える:

{{ var_dump($exception) }} 

とメモリエラーのうち(およびブラウザで500エラー)が確実に再現することができます。

これを削除すると、404ビューがうまく表示されます。

{{ dd($exception) }}と交換すると、トレースがレンダリングされます。

のではなぜのvar_dumpラインがメモリ不足エラーを引き起こすのでしょうか?

さらにこれを調べるにはどうすればよいですか?

私は$exception変数の内容が大きいので、これが最も可能性が高いが起こるLaravel 5.3に

答えて

1

です。変数をダンプすると、PHPはその変数を文字列表現に変換しようとします。これは、多くのメモリを使用します。

なぜ例外オブジェクト全体を出力する必要があるのか​​わかりません。残りの部分は関連するオブジェクトやインスタンスへの参照だけです。

+0

ありがとうございます。可能であれば、より深く調査することに興味がありますが、デバッグのスキルを向上させるには:爪をしたい!:)このような時代に私はリチャードファインマンを思い浮かべます。「問題が発生したら、ちょうど立ち去ることができません。 :) – mwal

+0

関数[Exception :: getTraceAsString](http://php.net/manual/en/exception.gettraceasstring.php)もご覧になれます – OptimusCrime

+0

私はそれを行いました。 dd()よりもはるかにコンパクトな形式です。次に、完全なスタックトレースを持つdd()が返すページの合計ファイルサイズを確認しました。回答:2MB。私は、メモリ不足エラーが発生する理由を知りたいのですが(私はPHPのデフォルトの128MBのメモリ制限にいます)。 2MBのスタックトレースを生成するには、PHPに128MB以上のメモリが必要ですか?それとも、別の何かが起こっていることを示唆していますか?私は気にする必要がありますか?調査するのは面白いですか?本当にありがとう。 – mwal

関連する問題