查詢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方法獲取錯誤信息