在 PHP 中,我們需要進行調試的時候,一般都會使用 memory_get_usage() 看下內存的使用情況。但如果想看當前的腳本 CPU 的佔用情況就沒有什麼現成的函數了。不過,PHP 也爲我們提供了一個擴展:XHProf ,這是由 FaceBook 開源的一個擴展,它可以幫我們看到當前腳本運行時的一些性能情況。
什麼是 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://www.php.net/manual/zh/book.xhprof.php
https://segmentfault.com/a/1190000003509917
===========
各自媒體平臺均可搜索【硬核項目經理】