系統性地找出 N+1 問題
介紹使用 Telescope 對 N+1 除錯的實用流程。不只單純察覺「同樣的 SELECT 反覆執行」,而是可將修正後的確認一併作為工作流程執行。1
從 Requests 找出慢的請求
開啟
/telescope,在 Requests 分頁找出執行時間較長的請求。2
從 Queries 確認發出的 SQL
展開請求詳情,會顯示該請求中執行的所有 SQL 查詢。若類似的 SELECT 敘述重複出現,即為 N+1。
3
加上 Eager Loading 進行修正
在程式碼加上
with(),然後重新確認查詢。若查詢數大幅減少即修正完成。dd() 或 log,這整個流程都能在瀏覽器上完成。
使用 Tag 追蹤特定請求
Telescope 有Tag功能。透過Telescope::tag() 為 entry 附加任意 tag 後,可在儀表板的過濾條件中快速篩選出該 tag 的 entry。
在只想追蹤特定 user ID 或 order ID 相關處理的情境下非常有效。
/telescope/requests 畫面的 Search 輸入 user:42,即可只列出 user ID = 42 的請求。
自動為模型附加 Tag
在TelescopeServiceProvider 的 tags 方法中,可為所有 entry 附加特定的 model ID。
HasTags contract,該模型被記錄時就會自動附加 tag。
Dump Watcher 的活用
使用dump() 時,輸出可能混入 HTML 回應,讓 API 除錯變得困難。使用 Telescope 的 Dump watcher 可將 dump() 的輸出從瀏覽器回應中分離,改為記錄到儀表板中。
用法很簡單,只要在打開 /telescope 的「Dump」分頁狀態下呼叫 dump() 即可。
dd() 不同的是它不會中止應用執行,適合連續發送多個請求的除錯情境。
透過 Mailpit 整合享受愉快的郵件除錯
將 Mail watcher 與本機 SMTP 伺服器 Mailpit 結合,可大幅改善郵件開發流程。除錯事件與 Listener
事件驅動實作的除錯常常變得棘手。要邊看 log 邊追蹤「事件有發送嗎?」「哪個 listener 被呼叫?」是很繁瑣的。 使用 Telescope 的 Events watcher 可用列表方式確認發出的事件及其 listener。 當 listener 沒有被呼叫時,可以在 Events 分頁確認事件的 entry。- 事件已發出但沒有顯示 listener → listener 沒有註冊(確認
EventServiceProvider) - 事件本身沒有發出 → 確認
event()的呼叫位置
佇列 Job 的除錯
非同步處理的除錯,光看 log 很難找出原因。Telescope 的 Jobs watcher 會紀錄從 job dispatch 到執行結果的資訊。 點擊失敗 job 的 entry 後,可看到 stack trace 與例外訊息。除了queue:failed 資料表外,Telescope 中也能確認,讓失敗原因調查更快速。
HTTP Client 的除錯
除錯與外部 API 通訊時,HTTP Client Watcher 十分有用。以Http:: facade 發出的請求與其回應會被記錄下來。
dd($response->json()) 就能在儀表板中確認。
總結
Laravel Telescope 指南
安裝與 watcher 設定的詳細資訊請參考指南頁面。
Laravel Nightwatch
正式環境監控請使用 Nightwatch。