The Art of Readable Code && High Performance Comments

之前看到 CodeIgniter 能透過 Profiler 輸出不少資訊,去尋找 PHP 上的可行方案,就這麼找到了 Xdebug。Xdebug 是一套 PHP 的 extension (or zend_extension),用於除錯與 Profiling 。

才沒過幾天,手上的某個專案在開發時,有個頁面的執行時間長到爆炸 (約 7-8秒)。本以為是架構不良,加上開發主機和資料庫伺服器不是同一台,因此吃網路連線才搞成這樣。但在實作某項神秘快取後,執行時間還是差不多 ˇˇ 應用 Xdebug 後發現登入函式被呼叫了兩百多次,佔95% 以上執行時間,這才發現欄位和權限的快取有問題,每次欄位查驗都會重到資料庫做登入/資料讀寫。修掉這個 bug 以後,執行時間就壓回 200ms 以下了 ˇˇ

實際使用時,若開啟 Xdebug Profiler,每個 query 會產生一個預設為 cachegrind.out.%p 的記錄檔;雖然網上爬到的資料有些舊,不過還是找得出有幾套軟體能夠開啟:

  • kcachegrind : 這是 KDE 的一部份,不過也有 Windows binary。Windows binary 貌似只能開啟 callgrind.* 的檔案,因此要去改變 xdebug.profiler_output_name 的設定值才好處理。個人建議改成 callgrind.%p.xdebug,然後把 .xdebug 關聯到 kcachegrind 執行檔,便於雙擊打開。
  • wincachegrind : Windows  上的另一套選擇,似乎已停止開發
  • cachegrindvisualizer : 基於 AIR ,理論上可以跨平台。不過我用它打開 xdebug 檔以後,只看他那個 progress bar 慢慢跑到 10%,我就沒耐心哩 ˇˇ
  • webgrind : 一套基於 PHP ,跑在網頁上的系統;在遠端主機工作時挺好用的 XD 不需要把 cachegrind 檔案下載回來再打開。

如果要手動選擇是否記錄 Profile,在 Firefox 上可以安裝 easy Xdebug,Chrome 也有 Xdebug enabler 可用;將 xdebug.profile_enable_trigger 設定為 on 之後,就能透過這兩套 extension 送出神奇字串啟動了。

至於將 Xdebug 當作 debugger 的功能,目前我沒需求,就先放著不學啦 XD

 

發表迴響

分類

%d 位部落客按了讚: