php錯誤異常及其排錯
錯誤和異常
錯誤
php程式自身的問題,一般是由非法的語法,環境問題導致
異常
一般是業務邏輯上出現的不合預期、與正常流程不同的狀況,不是語法錯誤
錯誤異常繼承關係
小括弧表示php版本
php7下的常見錯誤異常類型
常見錯誤/異常程式碼 | 類型 | try/catch | set_error_handler | set_exception_handler | register_shutdown_function(均觸發) |
---|---|---|---|---|---|
include/require "aaa" |
錯誤 | ||||
undefined() |
異常 | ||||
$arr=["a"=>1];echo $arr['b']; |
錯誤 | ||||
echo 1/0; |
錯誤 | ||||
intdiv(1,0) |
異常 | ||||
define("A",1);define("A",1); |
錯誤 | ||||
function a(); function a();//或者類的重複定義 |
錯誤 | ||||
function add($a,$b){return $a+$b;} add(1); add(1,2,3);//自動忽略了多餘的 |
異常 | ||||
$a=1; foreach ($a as $k=>$v){ echo $k."--".$v; } |
錯誤 | ||||
include "parseError.php"; //parseError.php 有語法錯誤 |
異常 | ||||
$a=null; $a->fun(); |
異常 |
錯誤和異常的有關主要配置
log_errors //開啟記錄錯誤日誌
display_errors //是否在頁面展示錯誤日誌
error_reporting //錯誤級別
error_log
如果該配置沒有設置,則錯誤資訊會被發送到 SAPI 錯誤記錄器。
例如,出現nginx的錯誤日誌中,或者在CLI中發送到 stderr
配置優先順序別fpm>ini>nginx
錯誤/異常有關處理函數
//www.php.net/manual/zh/ref.errorfunc.php
set_exception_handler
在exception_handler 調用後異常會中止
只能設置1個,未設置則返回NULL,再次設置返回上次的handler(5.5+),設置為NULL和restore_exception_handler()作用類似
set_error_handler
以下級別的錯誤不能由用戶定義的函數來處理,獨立於發生錯誤的地方: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT
如果錯誤發生在腳本執行之前,將不會 調用自定義的錯誤處理程式因為它尚未在那時註冊
傳入 null 重置處理程式到默認狀態,同restore_error_handler()
handler里error_types 里指定的錯誤類型都會繞過 PHP 標準錯誤處理程式, 除非回調函數返回了 false
如果handler返回 false,標準錯誤處理處理程式將會繼續調用
register_shutdown_function
不影響error_log的行為,可以多個
Yii里的異常和錯誤處理
- 出現錯誤-> 觸發->錯誤的處理handler->錯誤處理handler拋出異常-》觸發異常處理的hander->寫日誌/格式化輸出
- 出現異常->觸發異常處理的hander→寫日誌/格式化輸出
- 出現fatal錯誤→觸發 register_shutdown_function的handler->寫日誌/格式化輸出
常見的查錯
去哪找日誌,陌生的項目怎麼快速的找到日誌
1.去error_log文件找(php-fpm.conf→php.ini→nginx的error_log) 一定要注意日誌文件的許可權(fpm 的worker進程是否可寫)
2.找set_exception_handler,set_error_handler的返回
不找日誌,重置錯誤處理
不想管自定義的錯誤處理
把錯誤,異常處理的handeler全部重置掉,只去標準里去找即可
error_reporting(E_ALL);
ini_set("display_errors","On");
restore_exception_handler();
restore_error_handler();
常用調試
基本簡單的調試
var_dump(),print_r(),var_export()
Yii框架的幫助函數 比如 yii\helpers\VarDumper::dump/dumpAsString());
調用棧追蹤
1.debug_backtrace(int $options = DEBUG_BACKTRACE_IGNORE_ARGS, int $limit = 0)
調用到此處,調用鏈關係,根據需要傳需要的參數,節省開銷
2.get_included_files()
按順序列印載入文件的順序助於調試
比如常駐的(swoole,workerman)可以通過這個看,修改某個php文件(此處是不是已經載入到記憶體),用不用重啟服務
其它工具
Yii的debugger tool
為了調試方便對其他人不產生影響,可使用種cookie方式開啟(外加ip白名單)方式,比較適合yii混編的頁面調試
輔助配套的cookie-editor插件
//chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno?hl=zh-CN
whoops(類似yii debugger tool)
點擊左邊可以程式碼到那裡
chrome控制台
//github.com/ccampbell/chromephp
頁面有刷新跳轉時 可以開啟console日誌保持模式