【问题标题】:Symfony2: Custmize ErrorHandler->handle()Symfony2:自定义 ErrorHandler->handle()
【发布时间】:2014-04-11 16:15:06
【问题描述】:

跟进未回答的问题 Custom ExceptionListener picks up 403 & 404, but not 500 errorsSymfony 2.4: Why are 500 errors not caught by kernel.exception listener

我已经实现了一个自定义异常侦听器,它可以出色地处理 403 和 404 错误,但不能捕获 500 错误。我收到的一些反馈表明,在 Symfony 有机会运行之前发生了大约 500 个错误,因此无法被任何侦听器捕获。

我注意到的是,无论我生成什么类型​​的奇怪错误,无论是语法错误、未定义变量、未知方法、对非对象的方法调用等,似乎 ErrorHandler- >handle() 或 ErrorHandler->handleFatalError() 总是在开发环境中被调用(参见下面的一些示例)(虽然在开发环境中并非如此,我经常在 Symfony 中得到一个正常的 PHP 错误)。

我想要做的是,每当在生产环境中发生这样的错误时,我总是会显示一个用户友好的(糟糕,出了点问题)错误页面,并且总是发送一封包含错误细节的电子邮件。在我看来,如果我可以自定义 ErrorHandler->handle(),那么我将能够完成此任务。原因很简单,我想知道我的系统在生产中发生的任何错误。有人会认为这是一个比较常见的功能,但我做不到。

我仍在学习 Symfony,尽管我已经实现了自定义控制台命令、自定义身份验证处理程序以及更多复杂的安全功能,但我确实在为此苦苦挣扎。如果有丰富的 Symfony 经验的人能告诉我这是否可能,我将非常感激,如果可以,我将如何去做。

【问题讨论】:

    标签: php symfony error-handling


    【解决方案1】:

    您需要在生产环境中启用调试。在 app.php 中使用 Debug::enable()。请参阅symfony blog。 为了使错误通过电子邮件发送给您,可以使用独白。您需要使用适当的配置为频道“紧急”注册记录器以发送邮件。这是用于通过错误处理程序进行日志记录的通道。

    【讨论】:

      【解决方案2】:

      其实我也遇到了同样的问题,想出了一个解决办法。我不确定它是否是最好的,但它目前对我有用。

      我在 app.php 中添加了以下几行(在“使用”-Statment 之后的 app.php 之上):

      register_shutdown_function(function()
      {
          $error = error_get_last();
          if ($error != null)
          {
              $pageURL = 'http';
              if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
              $pageURL .= "://";
              if ($_SERVER["SERVER_PORT"] != "80") {
                  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"];
              } else {
                  $pageURL .= $_SERVER["SERVER_NAME"]; 
              }
              header("Location: ".$pageURL."/senderrorrequest?message=".$error['message']);
          }
      });
      

      通过这种方式,用户将被重定向到支持表单,并且错误会记录在 error.log 中。如果有人有更好的解决方案,我很乐意阅读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2014-08-28
        • 2017-10-21
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多