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