XHProf是一個分層PHP性能分析工具。它報告函數級別的請求次數和各種指標,包括阻塞時間,CPU時間和內存使用情況。一個函數的開銷,可細分成調用者和被調用者的開銷,XHProf數據收集階段,它記錄調用次數的追蹤和包容性的指標弧在動態callgraph的一個程序。它獨有的數據計算的報告/後處理階段。在數據收集時,XHProfd通過檢測循環來處理遞歸的函數調用,並通過給遞歸調用中每個深度的調用一個有用的命名來避開死循環。XHProf分析報告有助於理解被執行的代碼的結構,其目錄結構中自帶有一個由PHP編寫的瀏覽界面,便於用戶直觀的查看請求佔用性能情況。在graphviz插件的輔助下,也能繪製清晰調用關係圖。XHProf已經廣泛的應用於各大PHP開發的系統中。
安裝XHProf
1. 安裝PHP擴展,XHProf的官方下載地址爲http://pecl.php.net/package/xhprof,默認的PHP沒有自帶這個擴展,所以要進行安裝。
wget http://pecl.php.net/get/xhprof-0.9.3.tgz #獲取安裝包
tar zxf xhprof-0.9.3.tgz #解壓安裝包
cd xhprof-0.9.3 #進入文件夾
cp -r xhprof_html xhprof_lib /data/xhprof #根據具體情況進行拷貝
cd extension
phpize
./configure
make
make install
備註:xhprof_html中存放分析結果項目,用來展示性能分析,需要將文件夾放到apache的項目目錄下面才能運行訪問 ;xhprof_lib作爲三方庫,用於引入到PHP項目中。
2. 配置php.ini支持XHProf,如果不知道php.ini在哪裏,可以使用命令find / -name php.ini。
[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=/data/xhprof/logs #根據實際情況進行配置
配置成功後,重啓apache,使用service apache restart 或者service httpd restart等相關命令,如果phpinfo()出現如下頁面,表示安裝成功。
3. 安裝Graphviz,安裝Graphviz的目的是爲了xhprof圖形化web工具查看profiling log文件。
方式1:
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install
如果找不到對應的資源可以使用這個鏈接https://graphviz.gitlab.io/pub/graphviz/stable/SOURCES/graphviz.tar.gz。
方式2:使用命令 yum install graphviz 直接安裝。
4. 安裝libpng(可能需要的步驟)
編譯graphviz提示信息png: No (missing png.h),也就是dot 不支持PNG,此時需要安裝libpng包。
wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz
tar zxf libpng-1.5.1.tar.gz
cd libpng-1.5.1
./configure
make
make install
或者使用命令yum install libpng直接進行安裝。
開始進行性能分析
1. 創建一個文件test.php,然後按照下面的模式進行編碼。
<?php
// start profiling
xhprof_enable();
// xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); // 允許CPU和內存輸出
// run program
....
// stop profiler
$xhprof_data = xhprof_disable();
//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
$XHPROF_ROOT = "/projects/xhprof";//這裏填寫的就是你的xhprof的路徑
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";
?>
2. 查看分析報告
在瀏覽器中訪問該頁面後,會在/data/xhprof/logs這個目錄下面生成一個.xhprof_foo結尾的文件,然後會在頁面上顯示http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo 這句代碼,然後訪問上面說到的展示目錄http://xxx/xhprof_html/index.php?run=49bafaa3a3f66&source=xhprof_foo就可以看到內容了。
3. 查看函數調用圖,然後點擊[View Full Callgraph],就可以看到詳細的函數調用過程。
問題總結
1. 編譯XHProf擴展不通過,由於之前使用的xhprof-0.9.2版本,這個版本是09年的,比較老,換成xhprof-0
.9.3就可以編譯通過了。
2. 放在PHP裏面後,出現了報錯,將啓動改爲下面的代碼就好了。
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
3. 點擊[View Full Callgraph]出現了。以爲是沒有安裝好graphviz,結果是由於沒有找到日誌文件,請仔細讀懂下面語句的意思。
Error: either we can not find profile data for run_id 4d7f0bd99a12f or the threshold 0.01 is too small or you do not have ‘dot’ image generation utility installed.
4. 由於安裝了兩個版本的graphviz,手動安裝的版本沒有安裝好png支持,老是出現不支持png的提示,然後卸載掉這個手動版本就可以了,具體做法是cd到安裝目錄,執行make uninstall。