Centos下給PHP7新增Xhprof效能分析

OldBoy~發表於2018-01-18

什麼是 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時間和記憶體使用情況。

圖中紅色的部分為效能比較低,耗時比較長的部分,我們可以根據根據哪些函式被標記為紅色對系統的程式碼進行優化

相關文章