什麼是 Xhprof?
XHProf是facebook 開發的一個測試php效能的擴充套件,本文記錄了在PHP應用中使用XHProf對PHP進行效能優化,查詢效能瓶頸的方法。
它報告函式級別的請求次數和各種指標,包括阻塞時間,CPU時間和記憶體使用情況。
XHProf分析報告有助於理解被執行的程式碼的結構,它有一個簡單的HTML的使用者介面( PHP寫成的)。
基於瀏覽器的效能分析使用者介面能更容易檢視,或是與同行們分享成果。
也能繪製呼叫關係圖。
Xhprof 與 Xdebug 區別
Xdebug 是一個開放原始碼的PHP程式偵錯程式(即一個Debug工具)。
對於本地開發環境來說,進行效能分析 Xdebug 是夠用了。
但如果是線上環境的話,Xdebug 消耗較大,配置也不夠靈活。
下載安裝Xhprof
直接從github下載zip壓縮包,地址:https://github.com/longxinH/xhprof
# unzip xhprof-master.zip
# cd xhprof-master
# cd extension/
# phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhporf
# make && make install
# vim /usr/local/php/etc/php.ini //編輯php.ini,新增如下程式碼
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/xhprof.so
# service php-fpm restart //重啟
# php -m | grep xhprof //命令檢視是否安裝xhprof擴充套件
配置到專案中進行效能分析
我在同測試專案的Linux伺服器裡搭建了虛擬主機,把xhprof定義了一個域名訪問
我這使用的Nginx配置的虛擬主機,域名為:http://myxhprof.com,在你們搭建完成之後,可以試著訪問一下sample.php檔案,這是一個小Demo,有開始和結束為止,檔案中有註釋。
我所在的測試專案所用框架是tp,進入解壓包目錄下中的xhprof_lib目錄,把utils目錄拷貝到了專案目錄下,我放到了Lib目錄下,然後在common的公共函式檔案中寫入一個方法,程式碼如下,當然這個函式我簡單的定義了一下,如果您在實際生產環境中分析的話,可以專門定義一個區分線上線上的標識~
//common檔案自定義函式
function xhprof ()
{
$xhprof_data = xhprof_disable();
include_once "/data/wwwroot/default/gaiban/Lib/utils/xhprof_lib.php";
include_once "/data/wwwroot/default/gaiban/Lib/utils/xhprof_runs.php";
$xhprof_runs = new \XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo '開始效能分析地址:<a href="http://myxhprof.com/index.php?run='.$run_id .'&source=xhprof_foo" target="_blank">點選分析</a>';
}
//測試專案訪問的方法
<?php
class Test {
public function index()
{
//-------------------------------------------------------------程式執行開始函式位置
xhprof_enable();//---------------------------------------------程式執行開始函式位置
//-------------------------------------------------------------程式執行開始函式位置
$Rand_hot = $this->Rand_hot_article();
$Hot_list = $this->hot_acticle(5);
$links = $this->links();
$this->assign('links',$links);
$this->gg = $this->gonggao_merge();
$TagList = $this->Tags();
$Newlist_Page = $this->New_Article(18);
$Newlist = $Newlist_Page['list'];
$Page = $Newlist_Page['page'];
//-------------------------------------------------------------程式執行結束函式位置
xhprof();//------------這裡是common自定義的函式位置--------------程式執行結束函式位置
//-------------------------------------------------------------程式執行結束函式位置
$this->assign('Hot_list',$Hot_list);
$this->assign('Rand_list',$Rand_hot);
$this->assign('NewLIST',$Newlist);
$this->assign('Page',$Page);
$this->assign('TagList',$TagList);
$this->display();
}
然後訪問專案
形象化的檢視分析結果
使用xhprof_disable完成效能分析並且獲取到分析結果之後,我們通常不會直接輸出結果,因為這樣的結果是以陣列形式組織的,看起來並不直觀,幸運的是,xhprof提供了基於web的圖形介面對分析結果進行檢視。
在使用之前,請先確保伺服器安裝了graphviz工具,否則在生成監控圖表的時候回出現以下錯誤:
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
解決辦法直接yum安裝:
# yum install graphviz
如果安裝好了graphviz,仍然出現”failed to execute cmd”,檢查下伺服器上的php.ini中disable_functions這項是不是限制了proc_open,因為在xhprof_lib/utils/callgraph_utils.php的xhprof_generate_image_by_dot中使用了proc_open函式,或者設定“disable_functions = “ 即可,一般沒有必要在php.ini中關閉函式使用,人為修煉程式碼技術即可。
解決完錯誤,再次請求,出現下面效果圖。注意到中間的[View Full Callgraph]
連結,通過該連結我們可以看到圖形化的分析結果。
點選區域性,可以看到大圖。
以上,大家可以看到 函式級別的請求次數和各種指標,包括阻塞時間,CPU時間和記憶體使用情況。
圖中紅色的部分為效能比較低,耗時比較長的部分,我們可以根據根據哪些函式被標記為紅色對系統的程式碼進行優化