跟进未回答的问题Custom ExceptionListener picks up 403 & 404, but not 500 errors和Symfony 2.4: Why are 500 errors not caught by kernel.exception listener。
我已经实现了一个自定义异常listerner,它可以很好地处理403和404错误,但不会捕获500个错误。我得到的一些反馈表明,在Symfony有机会运行之前会发生大约500个错误,因此任何听众都无法捕获这些错误。
我注意到的是,无论我生成什么类型的奇怪错误,无论是语法错误,未定义变量,未知方法,非对象上的方法调用等,似乎ErrorHandler- > handle()或ErrorHandler->总是在开发环境中调用handleFatalError()(参见下面的一些示例)(虽然在开发环境中也是如此,我经常在Symfony内部得到正常的PHP错误)。
我想要做的是,每当在生产环境中发生这样的错误时,我总是显示用户友好(糟糕,出错了)错误页面并始终发送包含错误细节的电子邮件。对我来说似乎如果我可以自定义ErrorHandler-> handle(),那么我就能完成这个。原因很简单,我希望了解我的系统中出现的任何错误。人们会认为这是一个相对常见的功能,但我无法做到。
我还在学习Symfony,即使我已经实现了自定义控制台命令,自定义身份验证处理程序更多的复杂安全功能,我真的很挣扎。如果有一些具有广泛Symfony经验的人可以告诉我这是否可行,我会非常感激,如果是这样的话,我将如何去做。
答案 0 :(得分:1)
您需要在生产环境中启用调试。在app.php中使用Debug :: enable()。请参阅symfony blog。 为了通过电子邮件发送错误,可以使用monolog。您需要为通道“紧急”注册记录器,并使用适当的配置发送邮件。这是用于通过错误处理程序进行日志记录的通道。
答案 1 :(得分:0)
实际上我遇到了同样的问题并提出了解决方案。我不确定它是否是最好的,但它现在适用于我。
我在app.php中添加了以下行(在&#34之后的app.php之上;使用" -Statment):
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中。如果有人有更好的解决方案,我很高兴看到它。