8

次のような自分の Web サイト用のエラー ハンドラを作成しました。

function errorHandler($number, $string, $file, $line, $context, $type = '') {
// save stuff in DB
}

私はこのように登録します:

set_error_handler('errorHandler', E_ALL);

渡されたすべての変数を DB に保存し、問題のデバッグに役立つバックトレースを保存します。

print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT), true)

問題は、時々このエラーが発生することです:

134217728 バイトの許容メモリ サイズを使い果たしました (30084081 バイトを割り当てようとしました)

上記のエラーが発生したときにエラーハンドラーが実行された理由は、(PHP AWS ライブラリから) Amazon S3 オブジェクトを作成した後に未定義の変数を使用しようとしたためです。Amazon AWS ライブラリが非常に巨大であるため、バックトレースが大量のデータを取り込み、メモリ不足エラー (?) が発生するためだと思います。

デバッグに役立つように可能な場合はバックトレースを含めたいのですが、debug_backtrace()関数の呼び出しによって致命的なエラーが発生しないようにするにはどうすればよいですか (エラー ハンドラー内で、皮肉なことに..)?

4

6 に答える 6

8

DEBUG_BACKTRACE_PROVIDE_OBJECT を単に削除する必要があると思います

コードがオブジェクトに循環参照を持っている可能性があります。これは、オブジェクトをダンプすると、すべてのメモリが消費されるまでループすることを意味します。

これを行う別の方法は、例外をスローしてキャッチし、これを使用してバックトレースを取得することです

try{
  throw new Exception();
}catch(Exception $e){
  echo $e->getTraceAsString();
}

http://php.net/manual/en/exception.gettraceasstring.php

または、冗長性が必要な場合は、print_r($e->getTrace()); を試してください。

http://php.net/manual/en/exception.gettrace.php

于 2014-07-30T16:29:42.220 に答える
3

debug_backtrace に制限を設定できます。

print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 50), true);

PHP debug_backtrace

于 2014-07-25T23:13:16.420 に答える
1

おそらく最良の答えではありませんが、print_r の代わりに var_dump を使用することを検討しましたか? var_dump はネスト レベルを 2 つ下げるだけなので、edmondscommerce が言及した循環参照の問題によってメモリが使い果たされることはありません。

于 2014-08-01T19:39:30.717 に答える
1

最初に、本当にメモリが使い果たされているかどうかを確認してください。このエラーが発生したら、無限ループにたどり着きました。

サーバーは ini_set を許可していないため、ローカル システムにコピーしてメモリを 1 GB に増やし、メモリがまだ不足しているかどうかを確認することをお勧めします。これは無限ループです。

于 2014-08-01T15:16:35.363 に答える
0

メモリ制限を増やしてみてください:

ini_set("memory_limit","256M");
print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT), true);
于 2014-07-29T15:19:25.230 に答える