萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 程式除錯全攻略:從錯誤報告到 Xdebug 進階分析

一、PHP 內建錯誤報告機制

開發環境(開啟所有錯誤)

; php.ini
error_reporting = E_ALL | E_STRICT
display_errors = On
log_errors = On
error_log = /var/log/php/error.log

即使是 Notice(如未定義變數)也要修正,往往隱藏邏輯 Bug。

生產環境(隱藏前端、記錄日誌)

display_errors = Off
log_errors = On
error_log = /var/log/php/error.log

二、避免使用錯誤抑制運算子 @

@$fp = fopen(...) 會吞沒所有錯誤,導致除極度困難。僅在明確預期失敗且已有後續處理時使用(如 @mkdir() 忽略已存在錯誤)。

三、善用內建函數的錯誤回傳參數

$fp = @fsockopen("example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    error_log("連線失敗 [$errno]: $errstr");
    // 可根據 errno 判斷:111=連線被拒、110=逾時等
}

適用函數:fsockopen、stream_socket_client、mysql_connect (舊)、mysqli_connect_errno() 等。

四、引入專業除錯工具:Xdebug

安裝與基本設定 (php.ini)

zend_extension=xdebug.so
xdebug.mode=debug,develop,trace,profile
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.log=/var/log/xdebug.log

核心功能

  • 變數美化輸出:var_dump() 自動著色、摺疊、限制深度。
  • 堆疊追蹤:錯誤自動顯示完整呼叫鏈。
  • 遠端除錯 (DBGp):IDE (VS Code + PHP Debug / PhpStorm) 設定中斷點、單步執行、監看變數。
  • 程式碼覆蓋率:配合 PHPUnit 生成測試覆蓋報告。
  • 效能分析:xdebug.mode=profile 輸出 CacheGrind 格式,用 QCacheGrind/WebGrind 視覺化熱點。

五、業務邏輯錯誤除錯策略

  1. 確認預期 vs 實際結果
  2. 鎖定相關代碼區塊(Git blame、搜尋關鍵字)
  3. 關鍵變數輸出/記錄:error_log(print_r($var, true)) 或 Xdebug 監看
  4. 二分法縮小範圍:註解/跳過程式碼區塊,定位故障點
  5. 單元測試回歸:將 Bug 轉為測試案例,防止復發

六、非功能性錯誤(效能、記憶體、死循環)

  • Xdebug Profiler 找出耗時函數、記憶體峰值
  • memory_get_peak_usage()、microtime(true) 手動埋點
  • 慢查詢日誌(MySQL slow_query_log)
  • 生產環境可用 Blackfire.io、Tideways 低負擔持續剖析
copyright © 萬盛學電腦網 all rights reserved