如何使用Xdebug系列之三 使用xdebug分析PHP程序

本文为转载内容,正文中需注明作者及出处,若对您造成侵权,请联系我们

debug是一个可以用来跟踪,分析,调试PHP程序以及统计代码覆盖率的工具。本帖主要讲解如何用Xdebug来分析PHP程序。跟踪和分析的区别在于:跟踪是把程序运行的流程记录下来,二分析是对程序运行进行统计分析,既分析是统计一段声明(statement)被运行的次数以及运行所耗时间!


第一,生成分析日志
    Xdebug生成的分析日志只能借助一些工具来查看和分析。
在php.ini配置文件里添加xdebug.profiler_enable=On指令并重启web服务器既可Xdebug的打开分析功能。
xdebug.profiler_output_dir=”d:\traces”用来指定分析日志存放目录。默认状态下Xdebug会用新的分析日志内容来覆盖原先分析日志文件内容。xdebug.profiler_append=On指令使Xdebug把新的分析日志内容添加草原先分析日志文件内容的后面而不是覆盖原先内容。xdebug.profiler_enable_trigger=On指令使Xdebug能够根据程序运行时GET或者POST里是否有XDEBUG_PROFILE参数来打开或者关闭分析日志功能。例如在php.ini里配置xdebug.profiler_enable_trigger=On的情况下,运行test.php?XDEBUG_PROFILE就会产生分析日志,但运行test.php就不会产生分析日志。
第二,给分析日志命名
    默认情况下分析日志文件的名称是:cachegrind.out加上进程ID如:cachegrind.out.1628跟给跟踪日志规定命名规则一样,可以使用xdebug.profiler_output_name指令给分析日志规定命名规则。可使用的指定格式如下:

  • %p 进程ID
  • %r 随机数
  • %u 时间戳
  • %H $_SERVER[‘HTTP_HOST’]
  • %R $_SERVER[‘REQUEST_URI’]
  • %s 完整路径名(其中把斜线用下划线替换)

例如:xdebug.profiler_output_name=”%s”时:
产生的分析日志名称为:D__phpWorkspace_xdebug_index_php是D:/phpWorkspace/xdebug/index.php文件运行产生的。

第三,分析和查看分析日志
刚开始提到的,必须借助一些工具才能分析和查看分析日志文件,Xdebug产生的分析日志文件的格式是Cachegrind兼容格式,关于Cachegrind可以查看其他网上资料,这里不多讲。widows环境下,我们用wincachegrind 这个工具来查看分析日志文件,下载地址:http://sourceforge.net/projects/wincachegrind/下面看该工具的使用:
用wincachegrindd打开分析日志文件,如图:


左边窗口上方有几个比较重要的菜单:
点击切换红框标注里“钟表”菜单个”百分比“菜单即可切换程序运行所耗时间的绝对值和百分比的显示!
这里绝对值是按毫秒为单位,百分比是代码段运行时所耗时间在整个系统运行所耗时间里所占的百分比率。


绿框标注里第一个菜单叫”Hide Fast Functions“选中该菜单后即可隐藏掉运行速度较快的函数。被隐藏掉的一般是大部分php内部函数和一些速度快的用户函数。
第二个菜单叫”Hide Library Functions“选中该菜单后即可隐藏掉所有php内部函数。
这里选中“Hide Fast Functions“和“Hide Library Functions“菜单后效果如图:  


如图所示,只显示所耗时间最长的2个函数,其他都被隐藏了,这样做的好处就是,让我们能够不需要再看不重要的数据,而集中精力去查找和优化需要优化的代码。


主窗口有2个标签(tabs)一个叫”Line by line“,另一个叫”Overall“,2个其实差不多,”Overall“里的信息比”“Line by line“稍微详细一些。
Self“列表示的是当前代码块运行时自己所耗时间,“Cum”列表示的的当前代码块运行时自己所耗时间在加上他所引用的所有函数所耗时间的累计值。

第四,根据分析的数据优化代码

优化程序时一个很重要的经验法则是程序里尽可能的减少IO操作。因为跟其他计算相比IO操作所耗时间一般都比较长,所有有时候减少一个IO操作,比花很多时间去优化代码更有效。所以开始优化时先考虑IO问题。
其他优化相关的信息可以网上查找,这里不重点介绍如果优化PHP程序。