什麽是Xhprof
Xhprof是一個輕量級的分層性能測量分析器。在數據收集階段,它跟蹤調用次數與測量數據,展示程序動態調用的弧線圖。
它在報告、後期處理階段計算了獨佔的性能度量,例如運行經過的時間、CPU 計算時間和内存開銷。
Xhprof包含了一個基於 HTML 的簡單用戶界面(由 PHP 寫成),可以方便地瀏覽性能分析報告,這對理解代碼執行結構常常很有幫助。
安裝
Xhprof是PHP的一個擴展,所以只需要按照PHP擴展的編譯安裝方法來安裝即可。
1、下載擴展包
支持PHP 7+的Xhprof擴展包:https://github.com/longxinH/xhprof
wget https://github.com/longxinH/xhprof/archive/v2.2.0.tar.gz
2、解壓編譯
PHP擴展編譯三部曲:phpize、configure、make。
$ tar xzf xhprof-2.2.0.tar.gz $ cd xhprof-2.2.0/extension $ /usr/local/services/php7/bin/phpize $ ./configure --prefix=/usr/local/services/php7/lib/php/extensions/no-debug-zts-20160303 --with-php-config=/usr/local/services/php7/bin/php-config $ make
然後就可以在當前的modules目錄下看到編譯生成的so文档,將它拷貝到擴展目錄。
注:安裝autoconf庫:
yum -y install autoconf
3、配置php.ini
在php的配置文档中添加兩行配置,並重啓php-fpm:
extension=xhprof.soxhprof.output_dir=/data/release/xhprof_project/output
其中xhprof.output_dir用於指定存儲xhprof分析數據的目錄。
二、創建Xhprof項目
1、創建目錄
mkdir /data/release/xhprof_project
2、將相關文档拷貝到目錄下
cp -r /data/software/xhprof-2.2.0/xhprof_html /data/release/xhprof_project/ cp -r /data/software/xhprof-2.2.0/xhprof_lib /data/release/xhprof_project/
3、添加nginx訪問配置
server { listen 80; server_name xhprof.wkwkk.com; root /data/release/xhprof_project/xhprof_html; index index.php index.html; location ~* \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; } }
三、如何使用
在PHP腳本中使用的模式如下:
<?php // 開始分析 xhprof_enable(); // 你的代碼 // 停止分析 $xhprof_data = xhprof_disable(); // 導入兩個庫文档 $XHPROF_ROOT = "/data/release/xhprof_project"; 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_foo"); // 查看地址echo "http://xhprof.report.com/index.php?run=$run_id&source=xhprof_foo"
默認只會分析代碼的耗時,可以通過傳參控制是否分析代碼的memory和CPU性能數據:
xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
在瀏覽器打開輸出的地址,可以看到如下結果分析頁:
圖中的表格給出了代碼的性能分析數據,分別表示:
Funciton Name:函數名
Calls:調用次數
Calls%:調用佔比
Incl. Wall Time (microsec):函數運行時間(包括子函數)
IWall%:函數運行時間(包括子函數)佔比
Excl. Wall Time(microsec):函數運行時間(不包括子函數)
EWall%:函數運行時間(不包括子函數)佔比
點擊頁面中[View Full Callgraph]鏈接,可以繪制出一張可視化的性能分析圖。
如果點擊後報錯failed to execute cmd:" dot -Tpng". stderr:sh:dot:command not found,可能是缺少依賴庫graphviz,安裝即可。
四、在Laravel項目中使用
方法一:直接使用
直接嵌在接口函數的開始和結束處:
// API接口 public function testApi(Request $request) { // =============API開始處================ xhprof_enable(); // ===================================== for ($i=0; $i<5; $i++) { $this->bar($i); $len = strlen("songlee"); } // =============API結束處================ $xhprof_data = xhprof_disable(); $XHPROF_ROOT = "/data/release/xhprof_project"; 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_foo"); // ===================================== return json_encode(true); } // 私有方法 private function bar($num) { if ($num > 0) { $this->bar($num - 1); } }
這種方法顯然是最麻煩的。
方法二:封裝Helper
封裝成Helper放在app/Helpers目錄下,使用XhprofHelper::beginXhprof()、XhprofHelper::endXhprof()方法嵌入接口。
XhprofHelper如下:
<?php namespace App\Helpers; class XhprofHelper{ const XHPROF_ROOT = '/data/release/xhprof_project'; /** * 開始分析 * @return mixed */ static public function beginXhprof() { xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); return ; } /** * 停止分析 * @return mixed */ static public function endXhprof() { $xhprof_data = xhprof_disable(); // 導入兩個庫文档 include_once self::XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; include_once self::XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; // 保存這次分析的結果數據 $xhprof_runs = new \XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "api_demo"); return $run_id; } }
然後可以在代碼中使用:
// API接口 public function testApi(Request $request) { XhprofHelper::beginXhprof(); for ($i=0; $i<5; $i++) { $this->bar($i); $len = strlen("songlee"); } XhprofHelper::endXhprof(); return json_encode(true); }
方法三:在入口文档index.php中注入
將方法二中封裝的 XhprofHelper 文档放到入口文档所在的public目錄下,然後在index.php文档中加幾行代碼: