什麼是 XHProf
XHProf 是一個輕量級的分層效能測量分析器。在資料收集階段,它追蹤呼叫次數與測量數據,展示程式動態呼叫的弧線圖。它在報表、後製階段計算了獨佔的效能度量,例如運行經過的時間、CPU 運算時間和記憶體開銷。
函數效能報告可以由呼叫者和被呼叫者終止。在資料蒐集階段 XHProf 透過呼叫圖的循環來偵測遞歸函數,透過賦予唯一的深度名稱來避免遞歸呼叫的循環。
簡單來說,XHProf 就是能為我們收集很多程式去得時的系統狀態,並且它自帶一套線上圖表工具,能夠為我們提供詳盡的圖表資訊。
安裝
直接在 PECL 下載安裝擴充包即可。和其它的擴充安裝並沒有什麼兩樣,這個擴充功能一直在更新維護狀態中,所以對於 PHP7 版本都是完美支援的。
命令列使用
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); //xhprof_enable( XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); //xhprof_enable( XHPROF_FLAGS_MEMORY); //xhprof_enable(); for ($i = 0; $i <= 1000; $i++) { $a = $i * $i; } function test_application(){ for ($i = 0; $i <= 1000; $i++) { $a = $i * $i; } } test_application(); $xhprof_data = xhprof_disable(); print_r($xhprof_data); // Array // ( // [main()==>test_application] => Array // ( // [ct] => 1 // [wt] => 16 // [cpu] => 21 // [mu] => 848 // [pmu] => 0 // ) // [main()] => Array // ( // [ct] => 1 // [wt] => 115 // [cpu] => 115 // [mu] => 1416 // [pmu] => 0 // ) // )
使用xhprof_enable() 啟用分析器,它的參數是幾個常數,大概的意思是顯示CPU 資訊、記憶體資訊等,如果沒有參數的話則只會回傳ct 、 wt 這兩個參數。
呼叫 xhprof_disable() 結束分析並傳回分析結果,傳回值的內容包含 main 主函數的運行情況,也就是我們目前頁面測試程式碼的情況。還有呼叫的函數 test_application() 函數的效能情況。具體內容為:
ct:呼叫次數
wt:等待執行時間長,毫秒
cpu:cpu 運行時長,毫秒
mu:記憶體使用,位元組
pmu:記憶體使用峰值
沒錯,就是這麼簡單的內容。透過兩個函數的呼叫我們就能看到目前腳本程式的運作狀態,佔用了多少記憶體、耗費了多少 cpu 時長。當然,更方便的是,它還可以透過 web 頁面顯示更詳細的資訊。
web 查看結果報告
首先,我們需要做一些準備。一是要安裝一個 graphviz 用於圖形繪製,二是修改 php.ini 檔案的結果存放目錄,三是拷貝原始碼中的分析器程式碼並修改一下我們之前的測試程式碼。
yum install graphviz
CentOS 系統中我們直接使用 yum 就可以安裝 graphviz 。然後我們在 php.ini 檔案中為 xhprof 指定一下輸出目錄。
xhprof.output_dir=/tmp
接下來,我們需要將原始碼檔案中的 xhporf_html 目錄和 xhporf_lib 目錄拷貝出來放到專案檔案下。然後修改程式碼來保存效能分析的結果。
// ..... 上面的代码 $xhprof_data = xhprof_disable(); require 'xhprof_lib/utils/xhprof_lib.php'; require 'xhprof_lib/utils/xhprof_runs.php'; $xhprofRuns = new XHProfRuns_Default(); $runId = $xhprofRuns->save_run($xhprof_data, 'xhprof_test'); echo 'http://192.168.56.102/index.php?run=' . $runId . '&source=xhprof_test';
然後我們需要在 xhporf_html 搭起伺服器,在這裡我就用簡單的 php -S 指令運行。
cd xhprof_html/ php -S 0.0.0.0:80
最後用上面輸出的連結來造訪這個頁面,就可以看到相關的資訊了。
總結
今天的測試程式碼只是簡單的學習入門了一下 xhporf 的使用。其實這個擴充功能以及這套分析工具是可以整合到我們真實專案的框架中的。這樣,在測試環境我們就可以很好地監控目前程式的運作狀態。不過,還是不太建議放在正式環境中使用,畢竟 Debug 或這種效能分析的東西都不要對外,在正式環境,我們可以在命令列進行分析調優。
測試程式碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E7%AE%80%E5%8D%95%E5%AD%A6%E4%B9%A0PHP%E4%B8%AD%E7%9A%84%E5%B1%82%E6%AC%A1%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%99%A8.php
推薦學習:php影片教學