使用基于Symfony 2的网站处理生产中的PHP错误

时间:2012-05-14 07:47:10

标签: php exception-handling symfony hosting

我们正在生产几个symfony2网站,我们正在使用Airbrake和Sentry来收集异常。即使在生产中,真正的异常也能很好地工作,我们可以用很多上下文记录它们,我们可以向用户显示一个不错的500错误页面。

PHP错误是另一回事。我可以使用“on shutdown”处理程序将它们记录到Sentry,但是使用它我不能传递很多上下文。对于用户,也只有空503错误。这很糟糕,因为如果出现问题,我们无法向用户显示“下一步”。

来自Java背景我非常喜欢“真正的”异常,并且在开发模式中有一个类可以在异常中转换大量错误,但是没有记录或明显的方法在生产中启用它,所以我想也许我不应该再问一些问题;)

你们是如何处理这个问题的?它会带来什么样的性能损失?

这是来自http://groups.google.com/group/symfony2/browse_thread/thread/6129f57a35d8cb90?hl=en

的交叉点

4 个答案:

答案 0 :(得分:9)

  • 您应该将所有“错误”视为例外
  • 您应该发送正确的http标头代码并在网络服务器中拦截此http错误代码:http://wiki.nginx.org/HttpFastcgiModule#fastcgi_intercept_errors(在apache中也有类似的内容)
  • 您只需要关闭处理程序来记录“致命”事物
  • “关闭功能”中的
  • “context”不受限制(如果您在错误之前“分配”它!)
  • 最佳优化不是做错误;)

启用此功能的PHP方式:

  1. 错误(bootstrap!):

    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']));
        }
    }
    
  4. 这是-PHP-way™。你所有的“Symfony2™”ErrorHandling应保持不变。

答案 1 :(得分:1)

在Symfony2中,我们可以引入Error / Exception监听器服务(捕获所有错误),on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on

答案 2 :(得分: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();

[...]

答案 3 :(得分:0)

您可以为某些内核事件添加事件处理程序(Exception,OnResponse ....)