PHP性能分析工具 xhprof

Xhprof 是facebook開源出來的一個php輕量級的性能分析工具否彩,跟Xdebug類似奔坟,但性能開銷更低暇昂,還可以用在生產(chǎn)環(huán)境中尝抖,也可以由程序開關來控制是否進行profile。

官方已經(jīng)停止維護這個工具糠睡,官方最后發(fā)布的版本支持到php5.4以下(不包括5.4)挽鞠。

官方版本

現(xiàn)在github上維護著的是社區(qū)版,支持到php7+狈孔。

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 圖形界面訪問地址浪腐,可以看到這次的分析結果纵揍。

分析結果說明

微信圖片_20191106163619.png

下面說明一下頁面表格中的相關數(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] 就能自動跳轉到圖形結果界面。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤售,一起剝皮案震驚了整個濱河市丁鹉,隨后出現(xiàn)的幾起案子妒潭,更是在濱河造成了極大的恐慌,老刑警劉巖揣钦,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雳灾,死亡現(xiàn)場離奇詭異,居然都是意外死亡冯凹,警方通過查閱死者的電腦和手機佑女,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谈竿,“玉大人团驱,你說我怎么就攤上這事】胀梗” “怎么了嚎花?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呀洲。 經(jīng)常有香客問我紊选,道長,這世上最難降的妖魔是什么道逗? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任兵罢,我火速辦了婚禮,結果婚禮上滓窍,老公的妹妹穿的比我還像新娘卖词。我一直安慰自己,他們只是感情好吏夯,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布此蜈。 她就那樣靜靜地躺著,像睡著了一般噪生。 火紅的嫁衣襯著肌膚如雪裆赵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天跺嗽,我揣著相機與錄音战授,去河邊找鬼。 笑死桨嫁,一個胖子當著我的面吹牛植兰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞧甩,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼钉跷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肚逸?” 一聲冷哼從身側響起爷辙,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤彬坏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膝晾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栓始,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年血当,在試婚紗的時候發(fā)現(xiàn)自己被綠了幻赚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡臊旭,死狀恐怖落恼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情离熏,我是刑警寧澤佳谦,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站滋戳,受9級特大地震影響钻蔑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜奸鸯,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一咪笑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娄涩,春花似錦窗怒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弯蚜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剃法,已是汗流浹背碎捺。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贷洲,地道東北人收厨。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像优构,于是被迫代替她去往敵國和親诵叁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348