PHP5.3或之前版本可以去pecl(http://pecl.php.net)下載xhprof擴展安裝。
但pecl上的版本不支持PHP5.4
可以到github上的xhprof庫中下載:https://github.com/facebook/xhprof
下載后進行解壓安裝
1 cd xhprof-master/extension/ 2 phpize 3 ./configure --enable-xhprof 4 make 5 sudo make install
更改php.ini
1 [xhprof] 2 extension=xhprof.so 3 xhprof.output_dir="/document/gbyukg/www/test/xhprof"
重新啟動apache。
簡單使用:
1 // start profiling 2 xhprof_enable(); 3 4 // run program 5 ...... 6 7 // stop profiler 8 $xhprof_data = xhprof_disable();
xhprof_enable()允許接收一些參數,默認情況下,只會統計方法的調用次數和消耗的時間,通過傳遞參數(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY)打開統計CPU和內存使用率(在實際生產環境中會好關閉CPU統計信息,因為它會占用很多資源),同樣也可以通過傳遞XHPROF_FLAGS_NO_BUILTINS參數來禁用對PHP內置函數的統計,甚至通過傳遞第二個參數來禁用對指定函數的統計,如:
1 // ignore builtin functions and call_user_func* during profiling 2 $ignore = array('call_user_func', 'call_user_func_array'); 3 xhprof_enable(0, array('ignored_functions' => $ignore));
xhprof界面工具
頁面工具存儲在源代碼目錄中的xhprof_html文件夾下,同時需要xhprof_lib文件夾下的庫文件。將這2個文件夾放到php.ini文件中指定的報告生成的目錄中(應當是web服務器目錄中)。
創建頭和尾文件:
1 <?php 2 if (extension_loaded('xhprof')) { 3 include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_lib.php'; 4 include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_runs.php'; 5 xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 6 }
1 if (extension_loaded('xhprof')) { 2 $profiler_namespace = 'myapp'; // namespace for your application 3 $xhprof_data = xhprof_disable(); 4 $xhprof_runs = new XHProfRuns_Default(); 5 $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace); 6 7 // url to the XHProf UI libraries (change the host name and path) 8 $profiler_url = sprintf('http://myhost.com/xhprof/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace); 9 echo '<a href="'. $profiler_url .'" target="_blank">Profiler output</a>'; 10 }
最后配置.htaccess文件使之自動調用上述2個文件
1 php_value auto_prepend_file /document/gbyukg/www/xhprof/header.php 2 php_value auto_append_file /document/gbyukg/www/xhprof/footer.php
之后訪問xhprof_html目錄下的index.php文件
// start profiling xhprof_enable(); //profile CPU time and/or memory usage xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); // run program ...... // stop profiler $xhprof_data = xhprof_disable();
1 // start profiling 2 xhprof_enable(); 3 4 // run program 5 .... 6 7 // stop profiler 8 $xhprof_data = xhprof_disable(); 9 10 // 11 // Saving the XHProf run 12 // using the default implementation of iXHProfRuns. 13 // 14 include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; 15 include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; 16 17 $xhprof_runs = new XHProfRuns_Default(); 18 19 // Save the run under a namespace "xhprof_foo". 20 // 21 // **NOTE**: 22 // By default save_run() will automatically generate a unique 23 // run id for you. [You can override that behavior by passing 24 // a run id (optional arg) to the save_run() method instead.] 25 // 26 $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
在生成的統計表格中,可以按照各個統計列進行排序,如:
Number of Calls:方法的調用次數
Memory Usage:內存占用率
Peak Memory Usage:內存峰值
CUP Time:CPU占用時間(包括內核使用時間和用戶代碼調用時間)
Wall Time:執行時間(如果執行一個遠程調用,會包括CPU訪問遠程服務器、解析響應以及等待響應的時間和其它一些資源所占用的時間)
內存占用情況和CPU使用時間更進一步的分為Inclusive和Exclusive
Inclusive Time 包含該方法自己所占用的時間和該方法的所有子孫方法所占用的總資源或時間
Exclusive Time 僅僅包含該方法本身所占用的資源或時間
使用圖形界面
可以通過點擊頁面上方的View Full Callgraph鏈接打開生成的圖像模型,注意,在使用此功能前,請確保系統已經安裝過GraphViz,Ubunt中可通過下面命令進行安裝:
1 apt-get install graphviz
當需要對當前項目進行優化時,我們首先需要對CPU進行排序,找出CPU占用時間最多的方法進行優化,之后按照優化內存使用率進行排序,對內存使用率最高的方法進行優化,接着按照wall time進行排序優化。
差別與統計報告
XHProf允許你對兩次統計結果進行對比,對比方式是:
1 http://%xhprof-ui-address%/index.php?run1=XXX&run2=YYY&source=myapp
XXX和YYY是run id,myapp是命名空間,即save_run的第二個參數
同樣也可以經多次生成的統計結果合並到一起生成一個統計報告:
1 http://%xhprof-ui-address%/index.php?run=XXX,YYY,ZZZ&source=myapp
提示:
在對項目進行優化時,首先需要知道哪些地方需要優化,例如,項目中使用Zend Framewor,首先需要知道運行ZF框架所需要的資源以及時間,如果ZF運行時需要占用2.5M內存,那么不可能要讓整個項目的內存占用小於2.5M。
同時並不需要每次運行都生成統計報告,可修改頭問文件使之運行1000次生成一次報告。
header.php
1 $xhprof_on = false; 2 if (mt_rand(1, 10000) === 1) { 3 $xhprof_on = true; 4 if (extension_loaded('xhprof')) { 5 include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_lib.php'; 6 include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_runs.php'; 7 xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 8 } 9 }
footer.php
1 if ($xhprof_on && extension_loaded('xhprof')) { 2 $profiler_namespace = 'myapp'; // namespace for your application 3 $xhprof_data = xhprof_disable(); 4 $xhprof_runs = new XHProfRuns_Default(); 5 $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace); 6 7 // url to the XHProf UI libraries (change the host name and path) 8 $profiler_url = sprintf('http://myhost.com/xhprof/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace); 9 echo '<a href="'.$profiler_url.'" target="_blank">Profiler output</a>'; 10 }
