前言
性能分析是衡量應用程序在代碼級別的相對性能。性能分析將捕捉的事件包括:CPU的使用医增,內(nèi)存的使用,函數(shù)的調(diào)用時長和次數(shù)环葵,以及調(diào)用圖调窍,性能分析的行為也會影響應用性能宝冕。
在PHP的世界里张遭,有兩個截然不同的性能分析器-----主動和被動
主動 vs 被動性能分析
XDebug是一種主動分析器,在開發(fā)過程中使用地梨,由開發(fā)人員啟用菊卷。主動分析器收集的信息比被動分析器多,對性能的影響較大宝剖。通常不能應用宇生成環(huán)境中洁闰。
XHprof(本文主角)是一種被動分析器,由Facebook推出万细。是為了在生產(chǎn)環(huán)境中使用而打造的扑眉。它對應用性能的影響最小,同時可收集足夠多的信息用于診斷性能問題赖钞。
PHP7編譯安裝xhprof擴展
# xhprof官方擴展暫不兼容php7腰素,使用第三方
git clone https://github.com/longxinH/xhprof
cd xhprof/extension/
phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make && sudo make install
#說明
#由于每個人的環(huán)境不同,phpize命令和php-config雪营、php.ini的路徑可能不同
#這里介紹一個找文件強大的命令:locate ,具體參考(https://www.cnblogs.com/xqzt/p/5426666.html)
#編譯安裝完成后弓千,編輯php.ini
locate php.ini
sudo vi ****/****/php.ini
#在php.ini文件中增加extension=xhprof.so
#重啟php和nginx
#查看是否已經(jīng)安裝xhprof擴展
php -m | grep xhprof
#有輸出則代表安裝成功
xhprof實戰(zhàn)應用
使用起來很簡單,在你需要測試的代碼的首尾各添加xhprof_enable()和xhprof_disable()就好了
- 模板
1 <?php
2 // cpu:XHPROF_FLAGS_CPU 內(nèi)存:XHPROF_FLAGS_MEMORY
3 // 如果兩個一起:XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY
4 xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
5
6 // 要測試的php代碼
7
8
9 $data = xhprof_disable(); //返回運行數(shù)據(jù)
10
11 // xhprof_lib在下載的包里存在這個目錄,記得將目錄包含到運行的php代碼中
12 include_once "xhprof_lib/utils/xhprof_lib.php";
13 include_once "xhprof_lib/utils/xhprof_runs.php";
14
15 $objXhprofRun = new XHProfRuns_Default();
16
17 // 第一個參數(shù)j是xhprof_disable()函數(shù)返回的運行信息
18 // 第二個參數(shù)是自定義的命名空間字符串(任意字符串),
19 // 返回運行ID,用這個ID查看相關(guān)的運行結(jié)果
20 $run_id = $objXhprofRun->save_run($data, "xhprof");
21 var_dump($run_id);
-
實例
web查看
nginx添加sever配置
server {
listen 80;
server_name dev.xhprof.haodf.net;
root /home/dev/xhprof/xhprof_html;
index index.php;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
- 重啟nginx
- 配置本地hosts 10.1.xx.xx dev.xhprof.haodf.net
-
瀏覽器輸入訪問 dev.xhprof.haodf.net
-
隨便點一個文件訪問
-
查看view Full Callgraph (如果報錯的話:安裝graphviz: sudo yum install graphviz 即可)
圖中紅色的部分為性能比較低献起,耗時比較長的部分洋访,我們可以根據(jù)根據(jù)哪些函數(shù)被標記為紅色對系統(tǒng)的代碼進行優(yōu)化
補充
Function Name:方法名稱镣陕。
Calls:方法被調(diào)用的次數(shù)。
Calls%:方法調(diào)用次數(shù)在同級方法總數(shù)調(diào)用次數(shù)中所占的百分比姻政。
Incl.Wall Time(microsec):方法執(zhí)行花費的時間呆抑,包括子方法的執(zhí)行時間。(單位:微秒)
IWall%:方法執(zhí)行花費的時間百分比扶歪。
Excl. Wall Time(microsec):方法本身執(zhí)行花費的時間理肺,不包括子方法的執(zhí)行時間。(單位:微秒)
EWall%:方法本身執(zhí)行花費的時間百分比善镰。
Incl. CPU(microsecs):方法執(zhí)行花費的CPU時間妹萨,包括子方法的執(zhí)行時間。(單位:微秒)
ICpu%:方法執(zhí)行花費的CPU時間百分比炫欺。
Excl. CPU(microsec):方法本身執(zhí)行花費的CPU時間乎完,不包括子方法的執(zhí)行時間。(單位:微秒)
ECPU%:方法本身執(zhí)行花費的CPU時間百分比品洛。
Incl.MemUse(bytes):方法執(zhí)行占用的內(nèi)存树姨,包括子方法執(zhí)行占用的內(nèi)存。(單位:字節(jié))
IMemUse%:方法執(zhí)行占用的內(nèi)存百分比桥状。
Excl.MemUse(bytes):方法本身執(zhí)行占用的內(nèi)存帽揪,不包括子方法執(zhí)行占用的內(nèi)存。(單位:字節(jié))
EMemUse%:方法本身執(zhí)行占用的內(nèi)存百分比辅斟。
Incl.PeakMemUse(bytes):Incl.MemUse峰值转晰。(單位:字節(jié))
IPeakMemUse%:Incl.MemUse峰值百分比。
Excl.PeakMemUse(bytes):Excl.MemUse峰值士飒。單位:(字節(jié))
EPeakMemUse%:Excl.MemUse峰值百分比查邢。