查询ThinkPHP5是怎么捕获致命错误。
首先全局搜索"register_shutdown_function",ThinkPHP5是通过register_shutdown_function方法注册程序执行结束时调用函数,找到项目路径下./thinkphp/library/think/Error.php文件使用了注册方法,找到的代码如下:
/**
* 注册异常处理
* @access public
* @return void
*/
public static function register()
{
error_reporting(E_ALL);
set_error_handler([__CLASS__, 'appError']);
set_exception_handler([__CLASS__, 'appException']);
register_shutdown_function([__CLASS__, 'appShutdown']);
}
在该文件下找到方法appShutdown,找到的代码如下:
/**
* 异常中止处理
* @access public
* @return void
*/
public static function appShutdown()
{
// 将错误信息托管至 think\ErrorException
if (!is_null($error = error_get_last()) && self::isFatal($error['type'])) {
self::appException(new ErrorException(
$error['type'], $error['message'], $error['file'], $error['line']
));
}
// 写入日志
Log::save();
}
ThinkPHP5是通过register_shutdown_function方法注册结束时的函数回到,然后通过error_get_last方法获取错误信息