1、ThinkPHP源码学习-致命错误捕获及自定义错误输出
生活随笔
收集整理的這篇文章主要介紹了
1、ThinkPHP源码学习-致命错误捕获及自定义错误输出
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先在 Think\Think::start() 靜態方法中,使用 register_shutdown_function 函數注冊致命錯誤處理方法。
register_shutdown_function('Think\Think::fatalError');在 Think\Think::fatalError 方法中,首先記錄錯誤日志,這個暫且不說。接著使用 error_get_last 函數獲取錯誤信息,不過TP只匹配E_ERROR、E_PARSE、E_CORE_ERROR、E_COMPILE_ERROR、E_USER_ERROR 這五種錯誤類型,然后使用 ob_end_clean 函數清空并關閉輸出緩沖區(這樣做的目的是,不顯示PHP自身的錯誤信息提示,而是采用自定義的錯誤提示),最后調用自定義錯誤提示方法。
// 致命錯誤捕獲 static public function fatalError() {Log::save(); // 記錄日志if ($e = error_get_last()) {switch($e['type']){case E_ERROR:case E_PARSE:case E_CORE_ERROR:case E_COMPILE_ERROR:case E_USER_ERROR:ob_end_clean();self::halt($e);break;}} }self::halt($e) 方法細節:
// 錯誤輸出 static public function halt($error) {$e = array();if (APP_DEBUG || IS_CLI) {//調試模式下輸出錯誤信息if (!is_array($error)) {// 如果錯誤信息格式不是數組,使用回溯跟蹤函數debug_backtrace,可以定位到錯誤文件及錯誤行號。$trace = debug_backtrace();$e['message'] = $error;$e['file'] = $trace[0]['file'];$e['line'] = $trace[0]['line'];// 開啟并打印輸出緩沖區的內容ob_start();debug_print_backtrace();$e['trace'] = ob_get_clean();} else {$e = $error;}if(IS_CLI){// 如果開啟了命令行模式,直接輸出錯誤信息。exit(iconv('UTF-8','gbk',$e['message']).PHP_EOL.'FILE: '.$e['file'].'('.$e['line'].')'.PHP_EOL.$e['trace']);}} else {//否則定向到錯誤頁面$error_page = C('ERROR_PAGE');if (!empty($error_page)) {// 獲取錯誤文件的URL路徑,重定向至錯誤的文件,一般不會執行這段代碼。redirect($error_page);} else {// 在線上部署時,出于安全考慮,不應顯示過多的敏感信息,// 比如:錯誤文件及路徑,錯誤行號,錯誤原因。// C('SHOW_ERROR_MSG')為false時,顯示tp預定義好的錯誤提示:C('ERROR_MESSAGE') 頁面錯誤!請稍后再試~。$message = is_array($error) ? $error['message'] : $error;$e['message'] = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE');}}// 最后一步就是加載錯誤模板,想用戶展示錯誤信息// 路徑:項目根\ThinkPHP\Tpl\think_exception.tpl// 至于模板是什么樣子,自己可以隨意寫。// 包含異常頁面模板$exceptionFile = C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl');include $exceptionFile;exit; }總結
以上是生活随笔為你收集整理的1、ThinkPHP源码学习-致命错误捕获及自定义错误输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果没有传智播客和张老师,我现在不可能有
- 下一篇: stata里php代码,stata命令求