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;