PHP : Custom error handler - handling parse & fatal errors

标签 php error-handling fatal-error parse-error

如何使用 custom 错误处理程序处理 parsefatal 错误?

最佳答案

实际上,您可以处理解析错误和 fatal error 。确实不会调用您使用 set_error_handler() 定义的错误处理函数。方法是使用 register_shutdown_function() 定义一个关闭函数。这是我在我的网站上所做的工作:

文件 prepend.php(此文件将自动添加到所有 php 脚本中)。有关将文件附加到 PHP 的提示,请参见下文。

set_error_handler("errorHandler");
register_shutdown_function("shutdownHandler");

function errorHandler($error_level, $error_message, $error_file, $error_line, $error_context)
{
$error = "lvl: " . $error_level . " | msg:" . $error_message . " | file:" . $error_file . " | ln:" . $error_line;
switch ($error_level) {
    case E_ERROR:
    case E_CORE_ERROR:
    case E_COMPILE_ERROR:
    case E_PARSE:
        mylog($error, "fatal");
        break;
    case E_USER_ERROR:
    case E_RECOVERABLE_ERROR:
        mylog($error, "error");
        break;
    case E_WARNING:
    case E_CORE_WARNING:
    case E_COMPILE_WARNING:
    case E_USER_WARNING:
        mylog($error, "warn");
        break;
    case E_NOTICE:
    case E_USER_NOTICE:
        mylog($error, "info");
        break;
    case E_STRICT:
        mylog($error, "debug");
        break;
    default:
        mylog($error, "warn");
}
}

function shutdownHandler() //will be called when php script ends.
{
$lasterror = error_get_last();
switch ($lasterror['type'])
{
    case E_ERROR:
    case E_CORE_ERROR:
    case E_COMPILE_ERROR:
    case E_USER_ERROR:
    case E_RECOVERABLE_ERROR:
    case E_CORE_WARNING:
    case E_COMPILE_WARNING:
    case E_PARSE:
        $error = "[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line'];
        mylog($error, "fatal");
}
}

function mylog($error, $errlvl)
{
...do whatever you want...
}

如果在任何脚本中发现错误,PHP 将调用函数 errorHandler()。如果错误迫使脚本立即关闭,则由函数 shutdownHandler() 处理错误。

这是在我正在开发的网站上工作的。我还没有在生产中测试它。但它目前正在捕获我在开发时发现的所有错误。

我相信存在两次捕获相同错误的风险,每个函数一次。如果我在函数 shutdownHandler() 中处理的错误也被函数 errorHandler() 捕获,则可能会发生这种情况。

待办事项:

1 - 我需要开发一个更好的 log() 函数来优雅地处理错误。因为我仍在开发中,所以我基本上是将错误记录到数据库并将其回显到屏幕上。

2 - 为所有 MySQL 调用实现错误处理。

3 - 为我的 javascript 代码实现错误处理。

重要提示:

1 - 我在 php.ini 中使用以下行自动将上述脚本添加到所有 php 脚本中:

auto_prepend_file = "/homepages/45/d301354504/htdocs/hmsee/cgi-bin/errorhandling.php"

效果很好。

2 - 我正在记录并解决所有错误,包括 E_STRICT 错误。我相信开发干净的代码。在开发过程中,我的 php.ini 文件有以下几行:

track_errors = 1
display_errors = 1
error_reporting = 2147483647
html_errors = 0

当我上线时,我会将 display_errors 更改为 0,以降低我的用户看到难看的 PHP 错误消息的风险。

我希望这对某人有所帮助。

关于PHP : Custom error handler - handling parse & fatal errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900208/

相关文章:

php - 引用另一个表的加载条件 - Phpactiverecord

PHP:当我向我的网站发布内容时自动发送群组电子邮件

java - 定义我自己的异常时找不到符号

apache - 不存在的路径名的htaccess错误页面

php - 在数据库中存储和回显 php 代码

php - 获取数据并放入此表中

python - 批量错误重定向到文件

php - function_exists 返回 false 但声明抛出错误

android - 致命异常 :main

php - 在 PHP5 中记录致命/解析错误