Xdebug是一個開放源代碼的PHP程序調試器(即一個Debug工具),可以用來跟蹤,調試和分析PHP程序的運行狀況。Xdebug現在的最新版本是Xdebug 2.4.0RC4,release日期 2016-01-25,添加了對PHP7的支持。
1.Xdebug安裝
http://xdebug.org/download.php
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中配置使用。
配置參數選項 | 參數值類型與默認值 | 參數選項描述 |
---|---|---|
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.生成文件打開方式
http://sourceforge.net/projects/wincachegrind/
Xdebug提供了各種自帶的函數,並對已有的某些php函數進行覆寫,可以方便地用於調試排錯;Xdebug還可以跟 蹤程序的運行,通過對日志文件的分析,我們可以迅速找到程序運行的瓶頸所在,提高程序效率,從而提高整個系統的性能。
Self是代表此Funcion自己花費的時間,不包含此Function調用的其他Function。
Cum則是此Funcion整體花費的時間,包含此Function調用的其他Function。
/** *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;