4

私たちはいくつかの symfony2 Web サイトを本番環境で実行しており、Airbrake と Sentry の両方を使用して例外を収集しています。実際の例外は本番環境でも問題なく機能しており、多くのコンテキストでそれらをログに記録でき、適切な 500 エラー ページをユーザーに表示できます。

PHP エラーは別の話です。「シャットダウン時」ハンドラーを使用して Sentry にログを記録できますが、これを使用すると多くのコンテキストを渡すことができません。ユーザーには、空の 503 エラーのみがあります。何か問題が発生した場合にユーザーに「次の」ステップを示すことができないため、これは最悪です。

Javaのバックグラウンドから来て、私は「実際の」例外がとても好きで、開発モードでは多くのエラーを例外に変換するクラスがありますが、本番環境でこれを有効にする方法が文書化されていないか、明白ではないため、おそらくそうすべきだと思います.もう少し質問する前に ;)

皆さんはこれをどのように処理していますか? また、どのようなパフォーマンスの低下が伴いますか?

これはhttp://groups.google.com/group/symfony2/browse_thread/thread/6129f57a35d8cb90?hl=enからのクロスポストです。

4

4 に答える 4

9
  • すべての「エラー」を例外として処理する必要があります
  • 正しい http ヘッダー コードを送信し、Web サーバーでこの http エラー コードをインターセプトする必要があります: http://wiki.nginx.org/HttpFastcgiModule#fastcgi_intercept_errors (Apache にもこのようなものがあります)
  • 「致命的な」ものをログに記録するためだけにシャットダウンハンドラーが必要です
  • 「シャットダウン機能」の「コンテキスト」は制限されません(エラーの前に「割り当て」れば!)
  • 最善の最適化はエラーをしないことです;)

これを有効にする PHP の方法:

  1. エラー (ブートストラップ!):

    set_error_handler('errorToException');
    
    function errorToException($code, $message, $file = null, $line = 0) {
        if (error_reporting() == 0) {
            return true;
        }
        throw new \ErrorException($message, $code, $file, $line);
    }
    
  2. 例外 (ExceptionHandler クラス):

    set_exception_handler(array($this, 'exception'));
    
    public function exception(\Exception $e) {
        $this->logger->log($e);
    }
    
  3. 致命的なエラー (ExceptionHandler クラス):

    register_shutdown_function(array($this, 'shutdown'));
    
    public function shutdown() {
        $error = error_get_last();
        if (isset($error)) {
            $this->exception(new \FatalException($error['message'], $error['type'],     $error['file'], $error['line']));
        }
    }
    

これが PHP 流™です。すべての "Symfony2™" ErrorHandling は同じままにする必要があります。

于 2012-05-14T20:09:52.783 に答える
1

Symfony2 では、エラー/例外リスナー サービス (すべてのエラーをキャッチする) を導入でき、onKernelException() ですべてのドメイン ロジックを含めてエラー/例外を処理できます。

于 2013-10-30T12:41:55.567 に答える
0

一部のカーネルイベント(例外、OnResponse ....)にイベントハンドラーを追加できます。

于 2012-09-06T12:24:56.173 に答える