Xhprof 是facebook開源出來的一個php輕量級的性能分析工具否彩,跟Xdebug類似奔坟,但性能開銷更低暇昂,還可以用在生產(chǎn)環(huán)境中尝抖,也可以由程序開關來控制是否進行profile。
官方已經(jīng)停止維護這個工具糠睡,官方最后發(fā)布的版本支持到php5.4以下(不包括5.4)挽鞠。
現(xiàn)在github上維護著的是社區(qū)版,支持到php7+狈孔。
Xhprof 是以php擴展的形式的
本文基于 PHP7.2 版本信认,講解 xhprof的安裝和使用。
安裝 xhprof
# 文件存放目錄
cd /var/www
# 下載均抽、解壓文件
wget https://github.com/longxinH/xhprof/archive/v2.1.0.tar.gz
mv v2.1.0.tar.gz xhprof.tar.gz
tar -zxvf xhprof.tar.gz
# 進入需要編譯的文件夾
cd /var/www/xhprof/extension
#偵測環(huán)境嫁赏、配置、編譯油挥、安裝
phpize
./configure
make
make install
安裝成功后潦蝇,在php.ini文件中加入 xhprof 的相關配置
[XHPROF]
extension=xhprof.so
xhprof.output_dir=/var/www/xhprof_output
其中 xhprof.output_dir 用于配置 xhprof 分析文件的輸出目錄款熬。
配置完成后,重啟php服務
安裝畫圖相關擴展
libpng
wget https://github.com/glennrp/libpng/archive/v1.6.35.tar.gz
mv v1.6.35.tar.gz libpng-1.6.35.tar.gz
tar -zxvf libpng-1.6.35.tar.gz
cd libpng-1.6.35
./configure
make
make install
graphviz
apt-get install -y graphviz
graphviz 用于生成圖形化分析結果
配置 xhprof 圖形界面訪問地址
xhprof 的分析結果有圖形界面可以查看攘乒,我們需要配置nginx代理來使用這個圖形界面贤牛。
配置nginx,將目錄指向 /var/www/xhprof/xhprof_html/ 即可则酝。一下配置可用于參考:
server {
listen 80;
server_name loc.xhprof.com;
root /var/www/xhprof/xhprof_html/;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}
access_log /var/log/nginx/xhprof/access.log;
error_log /var/log/nginx/xhprof/error.log;
}
本地dns解析(hosts 文件)加上對應的配置
127.0.0.1 loc.xhprof.com
重啟 nginx 服務
現(xiàn)在通過訪問 loc.xhprof.com 就能看到分析結果殉簸,頁面會將 /var/www/xhprof_output 中的文件以列表方式展示出來。不過我們現(xiàn)在還沒做任何的代碼分析沽讹,所以現(xiàn)在訪問這個地址我們暫時看不到任何結果般卑。
使用 xhprof 分析代碼性能
加入數(shù)據(jù)采集代碼
在需要做性能分析的代碼段前后,引入xhprof相關代碼爽雄。
<?php
xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); //啟動 xhprof 性能分析器(開始監(jiān)控)
/* 此處是待分析的代碼段 */
/* 此處是待分析的代碼段 */
$xhprofData = xhprof_disable(); //結束監(jiān)控
include '/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php';
include '/var/www/xhprof/xhprof_lib/utils/xhprof_runs.php';
$xhprof_runs = new \XHProfRuns_Default();
$run_id = $xhprof_runs -> save_run($xhprofData, 'xhprof_testing');
上面代碼中引入的兩個文件都存在于在安裝步驟中 xhprof 目錄下蝠检。
xhprof_enable() 可以通過傳參來設置采集維度:
參數(shù) | 說明 |
---|---|
XHPROF_FLAGS_NO_BUILTINS | 使得跳過所有內(nèi)置(內(nèi)部)函數(shù) |
XHPROF_FLAGS_CPU | 使輸出的性能數(shù)據(jù)中添加 CPU 數(shù)據(jù) |
XHPROF_FLAGS_MEMORY | 使輸出的性能數(shù)據(jù)中添加內(nèi)存數(shù)據(jù) |
xhprof_disable() 返回每個方法的監(jiān)控數(shù)據(jù),輸出返回結果可以看到類似的結構:
[方法名] => Array
(
[ct] => 1 // 方法被調(diào)用的次數(shù)
[wt] => 419 // 方法耗時挚瘟,單位(微秒)
[cpu] => 0 // 消耗CPU時間叹谁,單位(微秒)
[mu] => 8264 // 內(nèi)存使用情況,單位(bytes)
[pmu] => 0 // 使用內(nèi)存峰值刽沾,單位(bytes)
)
xhprof_disable() 的返回結果只能得到每個方法的一些數(shù)據(jù)本慕,如果我們自己對這個結果做分析的話工作量還是很龐大的。后面我們用到 xhprof 自帶的圖形界面能更直觀的看出我們代碼的問題侧漓。
XHProfRuns_Default類內(nèi)的save_run方法,第二個參數(shù)傳項目名监氢。這個方法以 "采集ID.項目名.xhprof " 構成的文件名將采集結果保存到 /var/www/xhprof_output 中布蔗。
在執(zhí)行完代碼后,通過訪問 xhprof 圖形界面訪問地址浪腐,可以看到這次的分析結果纵揍。
分析結果說明
下面說明一下頁面表格中的相關數(shù)據(jù)表示
Incl. Including的縮寫,表示包含子函數(shù)的消耗
Excl. Excluding的縮寫议街,表示不包含子函數(shù)的消耗
Calls: 方法被調(diào)用的次數(shù)
Calls%: 方法被調(diào)用次數(shù)占總被調(diào)用次數(shù)的百分比
Incl.Wall Time: 函數(shù)本身加上子函數(shù)的運行時間
IWall%: 函數(shù)本身加上子函數(shù)的運行時間占總運行時間的百分比
Excl.Wall Time: 函數(shù)的運行時間
EWall%: 函數(shù)的運行時間占總運行時間的百分比
假如開了CPU監(jiān)控泽谨、內(nèi)存監(jiān)控,會有下面這幾個數(shù)據(jù)
Incl.CPU: 函數(shù)本身加上子函數(shù)執(zhí)行花費的CPU時間
ICPU%: 函數(shù)本身加上子函數(shù)執(zhí)行花費的CPU時間占總時間的百分比
Excl.CPU: 函數(shù)本身執(zhí)行花費的CPU時間
ECPU%: 函數(shù)本身執(zhí)行花費的CPU時間占總時間的百分比
Incl.MemUse: 函數(shù)本身加上子函數(shù)占用的內(nèi)存(單位:字節(jié))
IMemUse%: 函數(shù)本身加上子函數(shù)占用的內(nèi)存占總使用內(nèi)存的百分比
Excl.MemUse: 函數(shù)本身占用的內(nèi)存(單位:字節(jié))
EMemUse%: 函數(shù)本身占用的內(nèi)存占總使用內(nèi)存的百分比
Incl.PeakMemUse: 函數(shù)本身加上子函數(shù)占用內(nèi)存的峰值(單位:字節(jié))
Excl.PeakMemUse: 函數(shù)本身占用內(nèi)存的峰值(單位:字節(jié))
上面的表格已經(jīng)是一個比較直觀的數(shù)據(jù)了特漩,xhprof還支持圖形化的結果吧雹。
在使用圖形化結果之前,需要系統(tǒng)先安裝 graphviz涂身。graphviz 是用來根據(jù) xhprof 的結果繪制分析圖的雄卷。
點擊上面結果頁面中部的 [View Full Callgraph] 就能自動跳轉到圖形結果界面。