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

錯誤/異常有關處理函數

https://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插件

https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno?hl=zh-CN

whoops(類似yii debugger tool)


點擊左邊可以代碼到那裏

chrome控制檯

https://github.com/ccampbell/chromephp

頁面有刷新跳轉時 可以開啓console日誌保持模式

性能調試

xhprof+xhgui

xhprof

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章