2010-12-14 65 views
1

我一直在寻找所有过网,试图找到一种方法来捕获由PHP抛出的所有错误(5.3)管理PHP错误

我一直在读通过的文件,它看起来像set_error_handler正是我需要的但它不会得到致命/分析错误。我不确定这是否可能...

这是我的信息来源:https://github.com/tarnfeld/PHP-Error-Handler 如果你知道更好的解决方案,就可以随意使用fork/commit。

感谢先进!

更新!

使用下面的答案,我完成了一个error handler的处理,它处理E_ERROR | E_PARSE | E_WARNING | E_NOTICE,并且在致命的时候会杀死脚本! :-)

回答

4

引述手册:

以下错误类型不能与用户定义的函数来处理:E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING,大部分E_STRICT在调用set_error_handler()的文件中引发。

这意味着fatals不能被捕获和处理。 可以设置一个额外的处理程序,在脚本退出时运行,例如, register_shutdown_function

在该处理程序中,使用error_get_last并检查它是否为致命错误。这将不允许您继续执行脚本执行。该脚本将结束,但你可以做任何清理或日志记录(通常情况下,无论如何都会将致命错误记录到error.log)或其他内容。

有一个user-supplied example in the comments below set_error_handler

register_shutdown_function('shutdownFunction'); 
function shutDownFunction() { 
    $error = error_get_last(); 
    if ($error['type'] == 1) { 
     //do your stuff  
    } 
} 

但是请注意,这将仍然只捕获某些额外的运行时错误。

+0

甜。从来没有想过使用shutdown_function。 – Mchl 2010-12-14 12:02:10

0

不,捕捉致命错误和解析错误是不可能的。 解析错误,因为它们是在编译脚本之前引发的。 致命错误,因为它们是...致命的(即脚本遇到它们后无法继续运行)

+0

这很烦人。所以保持自己更新生产网站上的错误是不可能的!如何蹩脚:( – tarnfeld 2010-12-14 11:42:32

+0

你的产品代码应该永远不会有解析错误(来吧!这是一个体面的IDE可以帮助你)还有一些方法可以避免致命错误(例如,在尝试实例化对象之前检查class_exists()这个类) – Mchl 2010-12-14 11:44:58

+0

是的,我知道,没有那么多的解析错误,但我不希望网站只是因为内存不足而崩溃......输出一些快速文本给用户将是一个不错的选择 – tarnfeld 2010-12-14 11:48:47

2

您可能会留意error_log。在Ubuntu这个位于/var/log/apache2/error_log

0

如果您想要捕捉致命错误(包括解析错误),最好的解决方案是在php.ini文件中设置error_logging,例如

display_errors = Off 
log_errors = On 
ignore_repeated_errors = Off 
ignore_repeated_source = Off 
2

所谓的“致命错误”可能是php中最令人讨厌的错误。我们可以做的最好的事情就是说服“php群组”通过投票支持http://bugs.php.net/bug.php?id=28331来识别这个bug。

只要这不是固定的,我们注定要使用关闭错误处理程序或自动加载等肮脏的黑客。