一、說明
程式的開發及維護時,對程式掌握度的高低對開發維護的效率與質量影響很大,但我們又不可能將做過的程式永遠記得牢牢的,總會有其他人的改動,總會接觸其他人編寫的程式,所以個人對程式的閱讀追蹤能力很大一部份代表個人實力,在此介紹一些php web程式的閱讀追蹤方式。
除錯方法選擇指引
場景 | 推薦方法 | 適用時機 |
---|---|---|
快速查找畫面內容位置 | 字串搜尋 | 不熟悉專案結構時 |
追蹤程式執行流程 | 依流程追蹤 | 熟悉 MVC 架構時 |
找出程式錯誤點 | 插行號/Xdebug | 程式無輸出或邏輯錯誤 |
分析複雜邏輯 | Xdebug 斷點除錯 | 需要逐步檢查變數值 |
追蹤 AJAX 請求 | 瀏覽器 DevTools | 前後端資料交互問題 |
記錄系統運行狀態 | 日誌工具 (Monolog) | 生產環境除錯 |
二、程式結構與追蹤
2.1 web使用模型
網頁使用流程可解析成(MVC):
- User輸入網址
- Browser對Controller要求View頁面
- View對Controller發出ajax請求
- Controller透過Model存取Database
- Controller將資料ajax回應給View
- View渲染畫面給User

從流程中可看出,View是web系統的起點跟終點
2.2 字串搜尋方式追蹤
適用:想要找到畫面內容所在程式碼
以 Yii 2 basic 預設頁面為例,假設這個頁面我從未接觸過
我想將「Congratulations!」改成「Congratulations-trace」時,可直接從頁面原始碼中的目標附近找一個不太可能重複的字串,如「class=”jumbotron”」
將字串「class=”jumbotron”」貼到IDE的全專案搜尋中尋找,如字串選得好,找到的可能目標會非常少,很容易確認目標。
修改後查看狀況,完成!
使用本方法,需注意不要選可能是組合字、變數等字串,大略可用tag, id, class, style名稱/值 為搜尋字串
2.3 依流程追蹤
適用:想要找到畫面內容所在程式碼
從網址列可以得知目標是Controller: site, Method: index
打開目標程式,可以找到目標view檔案
打開目標View,找到目標,修改後查看成果。完成!
使用本方法,需熟知framework運作流程及相關函式。
2.4 插行號/檔名/字串方式追蹤
適用:
- 狀況一:當程式錯誤後會沒有任何輸出時
- 狀況二:當想知道有哪些判斷式被執行時
狀況一:當程式錯誤後會沒有任何輸出時
如果要確定在執行哪段程式時發生錯誤,可在可能的錯誤點前插行號。
下例假設資料處理掛了且沒有錯誤輸出。
1 | // 預設輸出 |
上例可看出:
- 最後一個輸出行號在資料處理之前
- $rule->validate($userData)驗証有通過,因為沒有看到丟出例外前的那個行號
- 當然如果不嫌麻煩,也可以不用__LINE__行號(魔術常量),而是自己定義輸出內容
狀況二:當想知道有哪些判斷式被執行時
1 | // 取得$userID在$startDate至$endDate的出勤資料 |
- 從輸出的 行號、定位loop迴圈數、印出迴圈內容 可協助判斷程式碼執行狀況。
- 當然如果不嫌麻煩,也可以不用__LINE__(行號魔術常量),而是自己定義輸出內容
2.5 追蹤呼叫歷程
適用: 想知道本函被呼叫的過程時,可使用函式debug_backtrace()取得呼叫歷程。
1 | class Home extends CI_Controller |
2.6 查看輸入輸出資料變化
適用:輸入輸出值錯誤 (沒有語法錯誤)
1 | // 查看參數值 |
- 觀察輸入輸出值是否符合預期
三、現代除錯工具
3.1 使用 Xdebug 進行斷點除錯
Xdebug 是 PHP 最強大的除錯工具,可以設定斷點、逐步執行、查看變數值。
安裝 Xdebug
1 | # Ubuntu/Debian |
設定 php.ini
1 | [xdebug] |
VS Code 設定
- 安裝擴充套件:PHP Debug
- 建立
.vscode/launch.json
:1
2
3
4
5
6
7
8
9
10
11{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
}
]
}
使用方式
- 在程式碼行號左側點擊設定斷點(紅點)
- 按 F5 啟動除錯模式
- 瀏覽器執行程式,觸發斷點
- 可逐步執行(F10)、進入函式(F11)、查看變數值
優點:
- 不需修改程式碼即可除錯
- 可即時查看所有變數狀態
- 支援條件斷點、監看變數
3.2 使用瀏覽器 DevTools 追蹤 AJAX
Chrome DevTools Network 面板
- 按 F12 打開開發者工具
- 切換到 Network 面板
- 執行 AJAX 請求
- 點擊請求查看:
- Headers:請求方法、URL、狀態碼
- Payload:POST 傳送的資料
- Response:伺服器回應內容
實用技巧
1 | // 在 Console 中攔截 AJAX 請求 |
3.3 使用 Monolog 記錄日誌
生產環境不適合使用 echo 或 Xdebug,應使用專業日誌工具。
安裝 Monolog
1 | composer require monolog/monolog |
基本使用
1 | use Monolog\Logger; |
日誌等級
- DEBUG:詳細的除錯資訊
- INFO:一般資訊訊息
- WARNING:警告訊息
- ERROR:錯誤訊息
- CRITICAL:嚴重錯誤
優點:
- 不影響程式執行效能
- 可記錄到檔案、資料庫、Email 等
- 支援不同等級的日誌過濾
- 適合生產環境長期監控