php xdebug之性能調試


Xdebug是一個開放源代碼的PHP程序調試器(即一個Debug工具),可以用來跟蹤,調試和分析PHP程序的運行狀況。Xdebug現在的最新版本是Xdebug 2.4.0RC4,release日期 2016-01-25,添加了對PHP7的支持

1.Xdebug安裝

下載xdebug
XDebug 下載地址:
http://xdebug.org/download.php
有兩個版本帶有Non-thread-safe和不帶有Non-thread-safe,主要是看你的 php版本是否 線程安全版本。
然后復制到你的php下的ext目錄里,
修改php.ini,增加如下信息:
[Xdebug]
zend_extension="x:\PHP\ext\php_xdebug-2.0.5-5.2.dll"
;以下是參數
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.trace_output_dir=”x:\Temp”
xdebug.profiler_enable=on
xdebug.profiler_output_dir=”x:\Temp”
;x為你的盤符
 
2.配置
xdebug.default_enable=on
;顯示默認的錯誤信息
xdebug.auto_trace=on
;自動打開“監測 函數調用過程”的功模。該功能可以在你指定的目錄中將函數調用的監測信息以文件的形式輸出。此 配置項的默認值為off。
xdebug.collect_params=on
;打開收集“函數參數”的功能。將函數調用的參數值列入函數過程調用的監測信息中。此配置項的默認值為off。
xdebug.collect_return=on
;打開收集“函數 返回值”的功能。將函數的返回值列入函數過程調用的監測信息中。此配置項的默認值為off。
xdebug.max_nesting_level=100
xdebug.profiler_enable=on
;打開效能監測器。
xdebug.remote_enable=on
;是否調試
xdebug.remote_host=localhost
xdebug.remote_port=9000
;調試端口
xdebug.remote_handler=dbgp
;選擇協議
xdebug.trace_output_dir="d:\Temp"
;設定 函數調用監測信息的輸出文件的路徑。
xdebug.profiler_output_dir="d:\Temp"
;設定效能監測信息輸出文件的路徑。

xdebug.auto_trace = 1

  是否允許Xdebug跟蹤函數調用,跟蹤信息以文件形式存儲,默認值為0

  collect_params = 1

  是否允許Xdebug跟蹤函數參數,默認值為0

  xdebug.collect_return = 1

  是否允許Xdebug跟蹤函數返回值,默認值為0

  xdebug.profiler_enable = 1

  打開xdebug的性能分析器,以文件形式存儲,這項配置是不能以ini_set()函數配置的,默認值為0

  xdebug.profiler_output_dir

  性能分析文件的存放位置,默認值為/tmp

  xdebug.profiler_output_name

  性能分析文件的命名規則,默認值為cachegrind.out.%p

  xdebug.trace_output_dir

  函數調用跟蹤信息輸出文件目錄,默認值為/tmp

  xdebug.trace_output_name

  函數調用跟蹤信息輸出文件命名規則,默認為trace.%c

  特別說明:Xdebug的trace和profiler的輸出文件名規則是可以更改的,比如將文件名命名為具體跟蹤的PHP執行文件名、進程ID、隨機數等,非常方便,更多的Xdebug配置選項說明,請參考官網的Xdebug配置選項說明

       
%c 當前工作目錄的crc32校驗值 trace.%c trace.1258863198.xt
%p 當前服務器進程的pid trace.%p trace.5174.xt
%r 隨機數 trace.%r trace.072db0.xt
%s 腳本文件名(注) cachegrind.out.%s cachegrind.out._home_httpd_html_test_xdebug_test_php
%t Unix時間戳(秒) trace.%t trace.1179434742.xt
%u Unix時間戳(微秒) trace.%u trace.1179434749_642382.xt
%H $_SERVER['HTTP_HOST'] trace.%H trace.kossu.xt
%R $_SERVER['REQUEST_URI'] trace.%R trace._test_xdebug_test_php_var=1_var2=2.xt
%S session_id (來自$_COOKIE 如果設置了的話) trace.%S trace.c70c1ec2375af58f74b390bbdd2a679d.xt
%% %字符 trace.%% trace.%.xt
注 此項不適用於trace file的文件名

  至此PHP調試工具Xdebug教程之Xdebug的安裝和配置就介紹完了,今后還將陸續介紹Xdebug如何在zend studio以及editplus中配置使用。

設置完參數,重啟服務器,使用 phpinfo() 函數查看是否有 xdebug 項目,安裝是否成功。
 
配置參數選項 參數值類型與默認值 參數選項描述
xdebug.auto_trace boolean類型,默認值=0 是否在腳本運行之前自動調用相關追蹤函數。
xdebug.cli_color integer類型,默認值=0 該參數自2.2版本開始引入。如果值=1,當處於CLI模式或連接虛擬控制台時,Xdebug將高亮顯示var_dumps()和堆棧輸出,;在Windows中,這需要安裝ANSICON工具。如果值=2,不管是否處於CLI模式或連接虛擬控制台,Xdebug都會高亮顯示var_dumps()或堆棧輸出;這種情況下,你可能會看到轉義后的代碼。
xdebug.collect_assignments boolean類型,默認值=0 該參數自2.1版本開始引入。用於控制是否為函數跟蹤添加變量賦值功能。
xdebug.collect_includes boolean類型,默認值=1 控制是否在跟蹤文件中寫入include()、include_once()、require()、require_once()等函數中用到的文件名。
xdebug.collect_params integer類型,默認值=0
控制在調用函數時,是否收集傳遞給函數的參數信息。如果參數值過大,這可能會占用大量的內存;不過,在Xdebug 2中不會出現該問題,因為Xdebug 2將相關數據寫入磁盤中,而不是占用內存。
如果值=0,則不顯示任何信息。
如果值=1,只顯示類型和大小信息,例如:string(6)、array(8)。
如果值=2,將顯示類型和大小,以及全部信息的工具提示。
如果值=3,將顯示變量的全部內容。
如果值=4,將顯示變量的全部內容和變量名。
xdebug.collect_return boolean類型,默認值=0 控制是否在追蹤文件中寫入函數調用返回值
xdebug.collect_vars boolean類型,默認值=0 控制是否收集指定作用域中的變量信息。由於需要反向工程PHP操作碼數組,因此Xdebug的分析速度可能比較慢。
xdebug.coverage_enable boolean類型,默認值=1 該參數自2.2版本開始引入。控制是否允許通過設置內部結構來啟用代碼覆蓋率功能。
xdebug.default_enable boolean類型,默認值=1 當發生異常或錯誤時,是否默認顯示堆棧信息。
xdebug.dump.* string類型,默認值=Empty
這里的*可以是 COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一個。用於指定發生錯誤時是否顯示超全局變量數組中的索引變量信息。比如,你想要顯示請求的IP地址和請求方式,可以設置為
xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD
多個索引變量用英文逗號隔開,如果要輸出其中的所有變量,可以直接用*,例如:
xdebug.dump.GET=*
xdebug.dump_globals boolean類型,默認值=1 控制是否顯示通過xdebug.dump.*定義的所有超全局變量的信息。
xdebug.dump_once boolean類型,默認值=1 如果出現多個錯誤,控制超全局變量信息是在所有錯誤中顯示,還是只在第一個錯誤中
xdebug.dump_undefined boolean類型,默認值=1 控制是否顯示超全局變量中未定義的值
xdebug.extended_info integer類型,默認值=1 是否強制進入PHP解析器的"extended_info"模式,這將允許Xdebug以遠程調試器對文件或行添加斷點。開啟此模式將拖慢腳本的允許速度,該參數只能在php.ini中設置。
xdebug.file_link_format string類型,默認值=, 自2.2版本開始引入。用於指定堆棧信息中用到的文件名稱的鏈接樣式,這允許IDE通過設置鏈接協議,直接點擊堆棧信息中的文件名稱,即可快速打開指定的文件。例如:ZendStudio://%f@%l(%f表示文件路徑,%f表示行號)。
xdebug.force_display_errors integer類型,默認值=0 自2.3版本開始引入。是否強制顯示錯誤信息。
xdebug.force_error_reporting integer類型,默認值=0 自2.3版本開始引入。是否強制顯示所有錯誤級別的信息。

 

3.生成文件打開方式

安裝 wincachegrind
WinCacheGrind 下載地址:
http://sourceforge.net/projects/wincachegrind/
由於效能監測文件:cachegrind.out.××××××××文件的內容不易被人類所理解,所以我們需要一個工具來讀取它。windows下就有一款這樣的軟件:wincachegrind。
1、到 下載安裝wincachegrind
2、安裝運行后,點擊Tools->options,設定你的working folder( php.ini里xdebug.profiler_output_dir的值)
這樣就可以比較直觀的查看效能監測文件的信息了。
 

Xdebug提供了各種自帶的函數,並對已有的某些php函數進行覆寫,可以方便地用於調試排錯;Xdebug還可以跟 蹤程序的運行,通過對日志文件的分析,我們可以迅速找到程序運行的瓶頸所在,提高程序效率,從而提高整個系統的性能。

Self是代表此Funcion自己花費的時間,不包含此Function調用的其他Function。

Cum則是此Funcion整體花費的時間,包含此Function調用的其他Function。

 
4.應用
 
/**
*xdebug.profiler_enable
*該配置默認為0,為開啟,設置為非0之后,即開啟profiler功能
*xdebug.profiler_output_dir
*該配置為上面開啟之后,存放生成分析文件的位置,需要保證位置可寫入,默認/tmp
*xdebug.profiler_enable_trigger
*如果開啟該選項,則在每次請求中如果GET/POST或cookie中包含//XDEBUG_PROFILE變量名,則才會生成性*能報告文件(前提是必須關閉
*xdebug.profiler_enable選項,否則該選項不起作用)。
*xdebug.profiler_output_name
*可以使用該配置修改生成的分析文件,默認cachegrind.out.%p
* 
*NOTE:
*建議使用xdebug.profiler_enable_trigger替代xdebug.profiler_enable。
* 
*B、涉及的函數
*string xdebug_get_profiler_filename()
*返回類型為字符串,用來返回分析的文件名字
*
**/

//error_reporting(0);
echo '覆蓋分析進行中...</br>';
 
// 構建封裝對象
class XdebugCoverageAnalysisModel {
      private $_coverage_info;
      private $_status;
 
      function __construct() {
          $this->_coverage_info = xdebug_get_code_coverage();////該函數返回數組值,用來搜集和返回代碼覆蓋分析的結果集信息。
          $this->_status =xdebug_code_coverage_started();//該函數返回布爾值,用來判斷代碼覆蓋分析功能是否開啟,未開啟則返回false。
        }
 
      // 獲取分析結果
      public function getCodeCoverageResult() {
           return json_encode(xdebug_get_code_coverage());
      }
 
      // 開啟覆蓋分析
      public function xdebugStartCodeCoverage() {
            xdebug_start_code_coverage( -1 | -2 );
            //1:代表代碼已經執行;
            //-1:代表代碼未被執行,對應函數參數XDEBUG_CC_UNUSED傳入;
            //-2:代表沒有可執行的代碼存在,對應XDEBUG_CC_DEAD_CODE和XDEBUG_CC_UNUSED
        }
 
      // 分析是否執行
      public function xdebugCodeStarted() {
           return xdebug_code_coverage_started();
      }
}
 
// 初始化
$apiModel = new XdebugCoverageAnalysisModel();
 
echo '開啟覆蓋分析...</br>';
$apiModel->xdebugStartCodeCoverage();
 
// 定義測試函數
function abc()
{
    for($i=0;$i<100000;$i++)
    {

    }
    abc2();
}
function abc2()
{
    for($i=0;$i<10000;$i++)
    {

    }
}
function coverageSample($a,$b) {
   echo '函數結果:'.($a * $b).'</br>';
   for($i=0;$i<1000000;$i++)
   {

   }
   //$a=[1];
  // $a->{0};
   //這里非法調用但是沒能追蹤到
   abc();
   abc2();
   abc();
   abc();
   abc();
   abc2();
}
 
echo '判斷是否開啟...</br>';
$status = $apiModel->xdebugCodeStarted();
if($status=='1') {
  echo '開啟覆蓋分析已完成</br>';
} else {
  echo '開啟覆蓋分析失敗了</br>';
}
 
echo '測試函數開啟...</br>';
coverageSample(10,10);
 
echo '獲取分析結果...</br>';
$result = $apiModel->getCodeCoverageResult();
echo $result.'</br>';
 
echo '關閉分析開關...</br>';
xdebug_stop_code_coverage();
 
$status = $apiModel->xdebugCodeStarted();
if($status=='1') {
  echo '覆蓋分析已經完成</br>';
} else {
  echo '覆蓋分析已經關閉!</br>';
}
 
unset($result);
unset($apiModel);
exit;

 

 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM