2012-05-14 10 views
4

私たちはいくつかのsymfony2ウェブサイトを運用しており、AirbrakeとSentryの両方を使用して例外を収集しています。実際の例外は本番環境でもうまく機能しており、多くのコンテキストでそれらをログに記録することができ、ユーザーに素晴らしい500エラーページを表示することができます。Symfony 2ベースのウェブサイトで運用中のPHPエラーを処理する

PHPエラーは別の話です。私は "on shutdown"ハンドラを使ってSentryにログを記録することができますが、これを使って多くのコンテキストを渡すことはできません。ユーザーには、空の503エラーだけがあります。これは、何か問題が生じた場合のためにユーザーに「次のステップ」を示すことができないためです。

"実際の"例外が非常に気に入っていますが、開発モードでは例外で多くのエラーを変換するクラスがありますが、これを実稼働環境で有効にする方法はありません。おそらく私はいくつかのことを尋ねる前にすべきではありません;)

あなたはどうやってこれを処理していますか、どのようなパフォーマンスのペナルティが伴いますか?

これはからのクロスポストです:あなたは右のHTTPヘッダコードを送信してウェブサーバに、このHTTPエラーコードを傍受すべき例外

  • など、すべてのあなたの「エラー」を処理する必要がありhttp://groups.google.com/group/symfony2/browse_thread/thread/6129f57a35d8cb90?hl=en

  • 答えて

    8
    • 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は同じままでなければなりません。あなたはSymfony2のでは、いくつかのカーネルイベント(例外、OnResponse ....)に

    +2

    [Error severity](http://php.net/manual/en/class.errorexception.php)に1つのパラメータがありません。 '\ FatalException'は存在しません。 – ChocoDeveloper

    0

    、我々は(すべてのエラーをキャッチ)エラー/例外リスナー・サービスを導入することができますし、onKernelException上の()エラー/例外を処理するためにすべてのドメインロジックを含めることができます。

    +1

    致命的なPHPエラー(例えば、既存の関数を呼び出さないなど)には役立ちません。 – naitsirch

    1

    をイベントハンドラを追加することができます

    1

    少なくともSymfony 2.3を使用していると仮定すると、新しい仕組みが整っています。

    use Symfony\Component\Debug\ErrorHandler; 
    
    require_once __DIR__.'/../app/bootstrap.php.cache'; 
    require_once __DIR__.'/../app/AppKernel.php'; 
    
    // we need to register the Error Handler in order 
    // to get fatal errors delivered as Exceptions 
    ErrorHandler::register(); 
    
    [...] 
    
    +1

    ああ、皮肉です。 '致命的なエラー:1708行目の/home/gracecom/app/cache/prod/classes.phpのSymfony \ Component \ Debug \ ErrorHandlerクラスを再宣言できません。 – darkbluesun

    関連する問題