欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php輕量級(jí)的性能分析工具xhprof的安裝使用

 更新時(shí)間:2015年08月12日 16:33:21   投稿:hebedich  
之前一直使用基于Xdebug進(jìn)行PHP的性能分析,對(duì)于本地開(kāi)發(fā)環(huán)境來(lái)說(shuō)是夠用了,但如果是線上環(huán)境的話,xdebug消耗較大,配置也不夠靈活,因此線上環(huán)境建議使用xhprof進(jìn)行PHP性能追蹤及分析。

一、前言

  有用的東西還是記錄下來(lái)吧,也方便以后的查詢;這次記錄一下xhprof的安裝使用;

  xhprof是facebook開(kāi)源出來(lái)的一個(gè)php輕量級(jí)的性能分析工具,跟Xdebug類似,但性能開(kāi)銷更低,

  還可以用在生產(chǎn)環(huán)境中,也可以由程序開(kāi) 關(guān)來(lái)控制是否進(jìn)行profile。

二、安裝

  wget http://pecl.php.net/get/xhprof-0.9.3.tgz 
  tar zxf xhprof-0.9.3.tgz 
  cd xhprof-0.9.3/extension
  /usr/bin/phpize 
 (php版本安裝后生成的phpize文件,可根據(jù)phpinfo查看,所以php版本不同,生成的phpize也不同,此步驟主要生成configure文件)
  ./configure –with-php-config=/usr/bin/php-config 
 (php-config的路徑,也是php安裝后生成的文件) 
  make 
  sudo make install 

 (會(huì)自動(dòng)將生成的擴(kuò)展文件拷貝到擴(kuò)展目錄中/usr/lib64/php/modules)

    當(dāng)然具體的php文件的目錄,每個(gè)人不盡相同,可根據(jù)phpinfo查詢

三、php.ini配置

根據(jù)phpinfo找到 extension_dir的目錄
(/etc/php.d/xhprof.ini)

添加一下內(nèi)容:

extension=xhprof.so
xhprof.output_dir=/tmp/xhprof //xhprof的分析日志

四、重啟服務(wù)

 sudo /etc/init.d/http restart

 查看phpinfo是否安裝成功

五、使用方法

開(kāi)頭:
xhprof_enable(); //開(kāi)啟監(jiān)測(cè) 
//xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); 不記錄內(nèi)置的函數(shù) 
//xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 同時(shí)分析CPU和Mem的開(kāi)銷 

//要測(cè)試的代碼
...
...
...

結(jié)尾:
$xhprof_data = xhprof_disable(); //停止監(jiān)測(cè),返回運(yùn)行數(shù)據(jù)
$xhprof_root = '/(xhprof的虛擬主機(jī)目錄)/'; 
 //引入當(dāng)初安裝到xhprof虛擬主機(jī)目錄中的文件
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();  
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof");
echo '<a href="http://(xhprof的虛擬主機(jī)域名)/xhprof_html/index.php?run='.$run_id.'&source=xhprof" target="_blank">xhprof統(tǒng)計(jì)</a>'; 

  上邊的代碼使用了,給xhprof設(shè)置虛擬主機(jī)的方法。

  把源碼包中的 xhprof_html 和 xhprof_lib 文件夾拷貝到自己建立的虛擬目錄中

  cp -r xhprof_html xhprof_lib /xxx/xhprof/  (此處目的是建立數(shù)據(jù)分析目錄,可將此目錄配置成虛擬主機(jī)訪問(wèn))

  運(yùn)行后,統(tǒng)計(jì)點(diǎn)擊返回的 xhprof統(tǒng)計(jì) 鏈接,即可。

六、注意問(wèn)題以及名詞解釋

  在顯示的統(tǒng)計(jì)頁(yè)面中,點(diǎn)[View Full Callgraph]圖形化顯示(最大的性能問(wèn)題會(huì)用紅色標(biāo)出,其次是黃色);

  點(diǎn)擊后,可能提示錯(cuò)誤消息,執(zhí)行以下命令即可

 yum install -y graphviz
 yum install graphviz-gd

  名詞解釋

 

Function Name 函數(shù)名
 Calls 調(diào)用次數(shù)
 Calls% 調(diào)用百分比
 Incl. Wall Time (microsec) 調(diào)用的包括子函數(shù)所有花費(fèi)時(shí)間 以微秒算(一百萬(wàn)分之一秒)
 IWall% 調(diào)用的包括子函數(shù)所有花費(fèi)時(shí)間的百分比
 Excl. Wall Time (microsec) 函數(shù)執(zhí)行本身花費(fèi)的時(shí)間,不包括子樹(shù)執(zhí)行時(shí)間,以微秒算(一百萬(wàn)分之一秒)
 EWall% 函數(shù)執(zhí)行本身花費(fèi)的時(shí)間的百分比,不包括子樹(shù)執(zhí)行時(shí)間
 Incl. CPU(microsecs) 調(diào)用的包括子函數(shù)所有花費(fèi)的cpu時(shí)間。減Incl. Wall Time即為等待cpu的時(shí)間
 減Excl. Wall Time即為等待cpu的時(shí)間
 ICpu% Incl. CPU(microsecs)的百分比
 Excl. CPU(microsec) 函數(shù)執(zhí)行本身花費(fèi)的cpu時(shí)間,不包括子樹(shù)執(zhí)行時(shí)間,以微秒算(一百萬(wàn)分之一秒)。
 ECPU% Excl. CPU(microsec)的百分比
 Incl.MemUse(bytes) 包括子函數(shù)執(zhí)行使用的內(nèi)存。
 IMemUse% Incl.MemUse(bytes)的百分比
 Excl.MemUse(bytes) 函數(shù)執(zhí)行本身內(nèi)存,以字節(jié)算
 EMemUse% Excl.MemUse(bytes)的百分比
 Incl.PeakMemUse(bytes) Incl.MemUse的峰值
 IPeakMemUse% Incl.PeakMemUse(bytes) 的峰值百分比
 Excl.PeakMemUse(bytes) Excl.MemUse的峰值
 EPeakMemUse% EMemUse% 峰值百分比

xhprof的安裝與簡(jiǎn)易用法

xhprof是Facebook開(kāi)源的輕量級(jí)PHP性能分析工具,Linux環(huán)境下可以通過(guò)pecl直接安裝,比如在Ubuntu下僅需3行指令

pecl install xhprof-beta
echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm restart

之后可以通過(guò)phpinfo()檢查擴(kuò)展是否已經(jīng)加載。

具體如何使用呢,xhprof項(xiàng)目中已經(jīng)提供了示例以及簡(jiǎn)易的UI,下載xhprof項(xiàng)目到web服務(wù)器,假設(shè)可以通過(guò)http://localhost/xhprof/訪問(wèn),那么訪問(wèn)http://localhost/xhprof/examples/sample.php可以看到一些輸出,并且提示通過(guò)訪問(wèn)http://<xhprof-ui-address>/index.php?run=XXX&source=xhprof_foo查看結(jié)果。接下來(lái)訪問(wèn)http://localhost/xhprof/xhprof_html/就可以看到已經(jīng)保存的結(jié)果,列出了所有函數(shù)的調(diào)用以及所消耗的時(shí)間。

分析一下示例代碼sample.php,關(guān)鍵部分只有2行:

//開(kāi)啟xhprof并開(kāi)始記錄
xhprof_enable();
//運(yùn)行一些函數(shù)
foo();
//停止記錄并取到結(jié)果
$xhprof_data = xhprof_disable();

$xhprof_data中記錄了程序單步運(yùn)行過(guò)程中所有的函數(shù)調(diào)用時(shí)間及CPU內(nèi)存消耗等,具體記錄哪些指標(biāo)可以通過(guò)xhprof_enable的入口參數(shù)控制,之后的處理已經(jīng)與xhprof擴(kuò)展無(wú)關(guān),大致是編寫(xiě)了一個(gè)存儲(chǔ)類XHProfRuns_Default,將$xhprof_data序列化并保存到某個(gè)目錄,可以通過(guò)XHProfRuns_Default(__DIR__)將結(jié)果輸出到當(dāng)前目錄,如果不指定則會(huì)讀取php.ini配置文件中的xhprof.output_dir,仍然沒(méi)有指定則會(huì)輸出到/tmp。

xhprof_html/index.php將記錄的結(jié)果整理并可視化,默認(rèn)的UI里列出了:
•funciton name : 函數(shù)名
•calls: 調(diào)用次數(shù)
•Incl. Wall Time (microsec): 函數(shù)運(yùn)行時(shí)間(包括子函數(shù))
•IWall%:函數(shù)運(yùn)行時(shí)間(包括子函數(shù))占比
•Excl. Wall Time(microsec):函數(shù)運(yùn)行時(shí)間(不包括子函數(shù))
•EWall%:函數(shù)運(yùn)行時(shí)間(不包括子函數(shù))

每一項(xiàng)應(yīng)該不難理解,以項(xiàng)目自帶的sample.php為例,示例中編寫(xiě)了一個(gè)main()函數(shù),main()函數(shù)中調(diào)用foo()、bar()等一些子函數(shù)進(jìn)行了一點(diǎn)字符處理。整個(gè)程序運(yùn)行過(guò)程中,main()函數(shù)只運(yùn)行了一次,并且由于main()函數(shù)中包括了所有的邏輯,所以main()函數(shù)的IWall%占比為100%,但是由于main()函數(shù)的功能都是由子函數(shù)實(shí)現(xiàn)的,因此main()函數(shù)的EWall%只有0.3%,而foo()函數(shù)完成了主要的工作,EWall%有98.1%。因此在分析更大型的程序時(shí),往往需要根據(jù)這幾項(xiàng)指標(biāo)分別排序,從不同的角度審視性能消耗。

在xhprof_html/index.php中還可以看到[View Full Callgraph]鏈接,點(diǎn)擊后可以繪制出一張可視化的性能分析圖,如果點(diǎn)擊后報(bào)錯(cuò)的話,可能是缺少依賴graphviz,ubuntu可以通過(guò)apt安裝
apt-get install graphviz

更好的注入方式

了解了上面這些,其實(shí)就已經(jīng)可以將xhprof整合到任何我們已有的項(xiàng)目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的開(kāi)始處注入xhprof的邏輯

//開(kāi)啟xhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
//在程序結(jié)束后收集數(shù)據(jù)
register_shutdown_function(function() {
  $xhprof_data    = xhprof_disable();

  //讓數(shù)據(jù)收集程序在后臺(tái)運(yùn)行
  if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();
  }

  //保存xhprof數(shù)據(jù)
  ...
});

但是這樣免不了要修改項(xiàng)目的源代碼,其實(shí)php本身就提供了更好的注入方式,比如將上述邏輯保存為/opt/inject.php,然后修改php fpm配置文件

vi /etc/php5/fpm/php.ini

修改auto_prepend_file配置

auto_prepend_file = /opt/inject.php

這樣所有的php-fpm請(qǐng)求的php文件前都會(huì)自動(dòng)注入/opt/inject.php文件

如果使用Nginx的話,還可以通過(guò)Nginx的配置文件設(shè)置,這樣侵入性更小,并且可以實(shí)現(xiàn)基于站點(diǎn)的注入。

fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";

相關(guān)文章

最新評(píng)論