Linux環境下面安裝PHP性能分析工具XHProf

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章