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 中的 尊重版权 尊重自我