接管错误处理·register_shutdown_function()

<?php
ini_set('display_errors', 'On'); // 将display_errors设置为On
error_reporting(-1); // 报告所有错误

/**
 * shutdown回调函数
 *
 * @return void
 */
function shutdown_function()
{
    $error = error_get_last(); // 若无错误则返回NULL
    if (is_array($error) && isset($error['type'])) {
        $errtype = "Unknown error {$error['type']}";
        if ($error['type'] === E_ERROR) { // E_ERROR === 1
            $errtype = 'Fatal error';
        }

        echo "🐵 {$errtype}: {$error['message']} in {$error['file']} on line {$error['line']} 🐵";
    }
}

register_shutdown_function('shutdown_function');

// 这里调用未定义函数,系统会报Fatal error
test(); // 🐵 Fatal error: ……此处省略内容若干…… on line 26 🐵

//========== 总结 ==========//
// 1、脚本执行完成、调用exit()、程序报Fatal error这些情况都会触发回调,所以需要通过error_get_last()判断错误情况。
// 2、若程序出现Fatal error,那么系统会先执行自己的错误处理程序(在页面输出错误信息),然后才调用开发者注册的回调函数。
// 3、register_shutdown_function()主要用于生产环境记录Fatal error,因为生产环境必须时刻屏蔽一切错误信息输出,如果生产环境出现
//    Fatal error页面只会报500错误,开发者不知道发生错误的文件和行号就会很难排错,而register_shutdown_function()则可以帮开发者
//    把详细的错误信息记录下来。

Copyright © 2024 码农人生. All Rights Reserved