一,什麼是XHProf
XHProf是一個分層PHP性能分析工具。它報告函數級別的請求次數和各種指標,包括 阻塞時間,CPU時間和內存使用情況。一個函數的開銷,可細分成調用者和被調用者的開銷,XHProf數據收集階段,它記錄調用次數的追蹤和包容性的指標 弧在動態callgraph的一個程序。它獨有的數據計算的報告/後處理階段。在數據收集時,XHProfd通過檢測循環來處理遞歸的函數調用,並通過給 遞歸調用中每個深度的調用一個有用的命名來避開死循環。XHProf分析報告有助於理解被執行的代碼的結構,它有一個簡單的HTML的用戶界面(
PHP寫成的)。基於瀏覽器的性能分析用戶界面能更容易查看,或是與同行們分享成果。也能繪製調用關係圖。
二,安裝XHProf擴展模塊
1,安裝
1 |
wget
http://pecl.php.net/get/xhprof-0.9.2.tgz |
2 |
tar zxvf
xhprof-0.9.2.tgz |
3 |
cp ./xhprof-0.9.2.tgz
./www //xhprof自身帶有一個web版的分析頁面,放到我的web服務器下面 |
4 |
cd xhprof-0.9.2/extension |
5 |
/usr/ local /php/bin/phpize |
6 |
./configure
-- enable -xhprof
--with-php-config=/usr/ local /php/bin/php-config |
7 |
make && make install |
2,配置
1 |
[xhprof] |
2 |
extension=xhprof.so |
3 |
xhprof.output_dir=/home/zhangy/xhprof
//如果不加存放目錄的話,默認是放在/tmp下面 |
三,XHProf測試
前面我們說過了,XHProf自身帶有一個web版的測試工具,裏面還有一個小例子。看一下這個例子,我做了一點修改和註釋
01 |
<?php |
02 |
function bar( $x )
{ |
03 |
if ( $x >
0) { |
04 |
bar( $x -1); |
05 |
} |
06 |
} |
07 |
function foo()
{ |
08 |
for ( $idx =
0; $idx <
5; $idx ++)
{ |
09 |
bar( $idx ); |
10 |
$x = strlen ( "abc" ); |
11 |
} |
12 |
} |
13 |
14 |
//啓動xhprof |
15 |
xhprof_enable(XHPROF_FLAGS_CPU
+ XHPROF_FLAGS_MEMORY); |
16 |
17 |
//調用foo函數,也是我們要分析的函數 |
18 |
foo(); |
19 |
20 |
//停止xhprof |
21 |
$xhprof_data =
xhprof_disable(); |
22 |
23 |
//取得統計數據 |
24 |
print_r( $xhprof_data ); |
25 |
26 |
$XHPROF_ROOT = realpath (dirname( __FILE__ )
. '/..' ); |
27 |
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php" ; |
28 |
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php" ; |
29 |
30 |
//保存統計數據,生成統計ID和source名稱 |
31 |
$xhprof_runs = new XHProfRuns_Default(); |
32 |
$run_id = $xhprof_runs ->save_run( $xhprof_data , "xhprof_foo" ); //source名稱是xhprof_foo |
33 |
34 |
//彈出一個統計窗口,查看統計信息 |
35 |
echo "<script
language='javascript'>window.open('../xhprof_html/index.php?run=" . $run_id . "&source=xhprof_foo');</script>" ; |
36 |
?> |
以下是部分的結果:
1 |
[foo==>bar]
=> Array |
2 |
( |
3 |
[ct]
=> 5 //bar()這個函數被調用了5次 |
4 |
[wt]
=> 63 //每次運行bar()所要的時間,不知道這個是不是平均值 |
5 |
[cpu]
=> 0 //每次運行bar(),cpu運算時間 |
6 |
[mu]
=> 2860 //每次運行bar(),php所使用內存的改變 |
7 |
[pmu]
=> 0 //每次運行bar(),php在內存使用最高峯時,所使用內存的改變 |
8 |
) |