­

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里的異常和錯誤處理

  1. 出現錯誤-> 觸發->錯誤的處理handler->錯誤處理handler拋出異常-》觸發異常處理的hander->寫日誌/格式化輸出
  2. 出現異常->觸發異常處理的hander→寫日誌/格式化輸出
  3. 出現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日誌保持模式

性能調試

xhprof+xhgui

xhprof

Tags: