php輕量級的效能分析工具xhprof的安裝使用_php技巧

來源:互聯網
上載者:User

一、前言

  有用的東西還是記錄下來吧,也方便以後的查詢;這次記錄一下xhprof的安裝使用;

  xhprof是facebook開源出來的一個php輕量級的效能分析工具,跟Xdebug類似,但效能開銷更低,

  還可以用在生產環境中,也可以由程式開 關來控制是否進行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檔案,可根據phpinfo查看,所以php版本不同,產生的phpize也不同,此步驟主要產生configure檔案)  ./configure –with-php-config=/usr/bin/php-config  (php-config的路徑,也是php安裝後產生的檔案)   make   sudo make install 

 (會自動將產生的擴充檔案拷貝到擴充目錄中/usr/lib64/php/modules)

    當然具體的php檔案的目錄,每個人不盡相同,可根據phpinfo查詢

三、php.ini配置

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

添加一下內容:

extension=xhprof.soxhprof.output_dir=/tmp/xhprof //xhprof的分析日誌

四、重啟服務

 sudo /etc/init.d/http restart

 查看phpinfo是否安裝成功

五、使用方法

開頭:xhprof_enable(); //開啟監測 //xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); 不記錄內建的函數 //xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 同時分析CPU和Mem的開銷 //要測試的代碼.........結尾:$xhprof_data = xhprof_disable(); //停止監測,返回運行資料$xhprof_root = '/(xhprof的虛擬機器主機目錄)/';  //引入當初安裝到xhprof虛擬機器主機目錄中的檔案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的虛擬機器主機網域名稱)/xhprof_html/index.php?run='.$run_id.'&source=xhprof" target="_blank">xhprof統計</a>'; 

  上邊的代碼使用了,給xhprof設定虛擬機器主機的方法。

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

  cp -r xhprof_html xhprof_lib /xxx/xhprof/  (此處目的是建立資料分析目錄,可將此目錄配置成虛擬機器主機訪問)

  運行後,統計點擊返回的 xhprof統計 連結,即可。

六、注意問題以及名詞解釋

  在顯示的統計頁面中,點[View Full Callgraph]圖形化顯示(最大的效能問題會用紅色標出,其次是黃色);

  點擊後,可能提示錯誤訊息,執行以下命令即可

 yum install -y graphviz yum install graphviz-gd

  名詞解釋

 

Function Name 函數名 Calls 調用次數 Calls% 調用百分比 Incl. Wall Time (microsec) 調用的包括子函數所有花費時間 以微秒算(一百萬分之一秒) IWall% 調用的包括子函數所有花費時間的百分比 Excl. Wall Time (microsec) 函數執行本身花費的時間,不包括子樹執行時間,以微秒算(一百萬分之一秒) EWall% 函數執行本身花費的時間的百分比,不包括子樹執行時間 Incl. CPU(microsecs) 調用的包括子函數所有花費的cpu時間。減Incl. Wall Time即為等待cpu的時間 減Excl. Wall Time即為等待cpu的時間 ICpu% Incl. CPU(microsecs)的百分比 Excl. CPU(microsec) 函數執行本身花費的cpu時間,不包括子樹執行時間,以微秒算(一百萬分之一秒)。 ECPU% Excl. CPU(microsec)的百分比 Incl.MemUse(bytes) 包括子函數執行使用的記憶體。 IMemUse% Incl.MemUse(bytes)的百分比 Excl.MemUse(bytes) 函數執行本身記憶體,以位元組算 EMemUse% Excl.MemUse(bytes)的百分比 Incl.PeakMemUse(bytes) Incl.MemUse的峰值 IPeakMemUse% Incl.PeakMemUse(bytes) 的峰值百分比 Excl.PeakMemUse(bytes) Excl.MemUse的峰值 EPeakMemUse% EMemUse% 峰值百分比

xhprof的安裝與簡易用法

xhprof是Facebook開源的輕量級PHP效能分析工具,Linux環境下可以通過pecl直接安裝,比如在Ubuntu下僅需3行指令

pecl install xhprof-betaecho "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.iniservice php5-fpm restart

之後可以通過phpinfo()檢查擴充是否已經載入。

具體如何使用呢,xhprof項目中已經提供了樣本以及簡易的UI,下載xhprof項目到web伺服器,假設可以通過http://localhost/xhprof/訪問,那麼訪問http://localhost/xhprof/examples/sample.php可以看到一些輸出,並且提示通過訪問/index.php?run=XXX&source=xhprof_foo">http:///index.php?run=XXX&source=xhprof_foo查看結果。接下來訪問http://localhost/xhprof/xhprof_html/就可以看到已經儲存的結果,列出了所有函數的調用以及所消耗的時間。

分析一下範例程式碼sample.php,關鍵區段只有2行:

//開啟xhprof並開始記錄xhprof_enable();//運行一些函數foo();//停止記錄並取到結果$xhprof_data = xhprof_disable();

$xhprof_data中記錄了程式單步運行過程中所有的函數調用時間及CPU記憶體消耗等,具體記錄哪些指標可以通過xhprof_enable的入口參數控制,之後的處理已經與xhprof擴充無關,大致是編寫了一個儲存類XHProfRuns_Default,將$xhprof_data序列化並儲存到某個目錄,可以通過XHProfRuns_Default(__DIR__)將結果輸出到目前的目錄,如果不指定則會讀取php.ini設定檔中的xhprof.output_dir,仍然沒有指定則會輸出到/tmp。

xhprof_html/index.php將記錄的結果整理並可視化,預設的UI裡列出了:
•funciton name : 函數名
•calls: 調用次數
•Incl. Wall Time (microsec): 函數已耗用時間(包括子函數)
•IWall%:函數已耗用時間(包括子函數)佔比
•Excl. Wall Time(microsec):函數已耗用時間(不包括子函數)
•EWall%:函數已耗用時間(不包括子函數)

每一項應該不難理解,以項目內建的sample.php為例,樣本中編寫了一個main()函數,main()函數中調用foo()、bar()等一些子函數進行了一點字元處理。整個程式運行過程中,main()函數只運行了一次,並且由於main()函數中包括了所有的邏輯,所以main()函數的IWall%佔比為100%,但是由於main()函數的功能都是由子函數實現的,因此main()函數的EWall%只有0.3%,而foo()函數完成了主要的工作,EWall%有98.1%。因此在分析更大型的程式時,往往需要根據這幾項指標分別排序,從不同的角度審視效能消耗。

在xhprof_html/index.php中還可以看到[View Full Callgraph]連結,點擊後可以繪製出一張可視化的效能分析圖,如果點擊後報錯的話,可能是缺少依賴graphviz,ubuntu可以通過apt安裝
apt-get install graphviz

更好的注入方式

瞭解了上面這些,其實就已經可以將xhprof整合到任何我們已有的項目中去了。目前大部分MVC架構都有唯一的入口檔案,只需要在入口檔案的開始處注入xhprof的邏輯

//開啟xhprofxhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);//在程式結束後收集資料register_shutdown_function(function() {  $xhprof_data    = xhprof_disable();  //讓資料收集程式在後台運行  if (function_exists('fastcgi_finish_request')) {    fastcgi_finish_request();  }  //儲存xhprof資料  ...});

但是這樣免不了要修改項目的原始碼,其實php本身就提供了更好的注入方式,比如將上述邏輯儲存為/opt/inject.php,然後修改php fpm設定檔

vi /etc/php5/fpm/php.ini

修改auto_prepend_file配置

auto_prepend_file = /opt/inject.php

這樣所有的php-fpm請求的php檔案前都會自動注入/opt/inject.php檔案

如果使用Nginx的話,還可以通過Nginx的設定檔設定,這樣侵入性更小,並且可以實現基於網站的注入。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.