PHP捕获错误||PHP捕获致命错误||PHP捕获非致命错误

php是可以捕获致命的错误的

在很多场景中,我们涉及到相对mysql的错误日志进行记录,又不想直接直接写php错误日志文件,因为多服务器的情况下,写入文件在日志分析上还是有一定的问题. 其实涉及到两个函数

set_error_handler — 设置一个用户定义的错误处理函数 但是这个函数是有缺陷的,在官方的文档中有如下的内容

以下级别的错误不能由用户定义的函数来处理: E_ERROR 、 E_PARSE 、 E_CORE_ERROR 、 E_CORE_WARNING 、 E_COMPILE_ERROR 、 E_COMPILE_WARNING ,和在 调用 set_error_handler()  函数所在文件中产生的大多数 E_STRICT 。 

所以如果程序出现了致命错误,或者语法错误,这个函数是没有办法处理的,

register_shutdown_function - register_shutdown_function — Register a function for execution on shutdown

这个函数其实就是在php脚本执行完之后调用一个函数,我们就可以用register_shutdown_function + error_get_last 2个函数来捕获致命错误

函数如下

 register_shutdown_function('handleFatal');
function handleFatal()
{
    $error = error_get_last();
    if (isset($error['type']))
    {
        switch ($error['type'])
        {
        case E_ERROR :
        case E_PARSE :
        case E_CORE_ERROR :
        case E_COMPILE_ERROR :
            $message = $error['message'];
            $file = $error['file'];
            $line = $error['line'];
            $log = "$message ($file:$line)\nStack trace:\n";
            $trace = debug_backtrace();
            foreach ($trace as $i => $t)
            {
                if (!isset($t['file']))
                {
                    $t['file'] = 'unknown';
                }
                if (!isset($t['line']))
                {
                    $t['line'] = 0;
                }
                if (!isset($t['function']))
                {
                    $t['function'] = 'unknown';
                }
                $log .= "#$i {$t['file']}({$t['line']}): ";
                if (isset($t['object']) and is_object($t['object']))
                {
                    $log .= get_class($t['object']) . '->';
                }
                $log .= "{$t['function']}()\n";
            }
            if (isset($_SERVER['REQUEST_URI']))
            {
                $log .= '[QUERY] ' . $_SERVER['REQUEST_URI'];
            }
            //把错误日志写入文件或者其他
        default:
            break;
        }
    }
}

ps 这个函数是复制的韩天峰的wiki http://wiki.swoole.com/wiki/page/305.html 中的 尊重版权 尊重自我

发布于