正式开始《用 Xdebug 进行基准测试和代码覆盖率分析》。
一、使用 Xdebug 进行基准测试
可以使用以下函数获取基准测试信息。
int xdebug_memory_usage()
这个函数返回函数被调用时当前的内存使用情况。
int xdebug_peak_memory_usage()
这个函数返回函数被调用时,启动脚本之后脚本所使用内存的峰值。
float xdebug_time_index()
这个函数返回脚本执行的总时间,具体数据以秒来计。返回的数据很精确,并且允许跟踪执行得比较慢的 PHP 代码块。
使用以上 Xdebug 函数可以获取局部代码的基准测试信息,很灵活。另外,还可以进行应用程序范围的基准测试,可以提供应用程序中很多脚本、函数、类等基准测试信息,这些在前文已经述及。
二、使用 Xdebug 检查代码覆盖
如果在某个文件中只有一部分代码经常被执行,通过提取和分离这些代码,将这个文件分为两个或多个文件,就可能会获得一些性能的提升。代码覆盖也有助于找出那些从来不会被执行的僵尸代码,或者根本无法访问的代码。
所以,了解一套应用系统中所有代码的工作情况很有用,有必要对代码的执行情况心中有数。但这是手工无法完成的。于是 Xdebug 提供的代码覆盖功能就派上了用场。
Xdebug 代码覆盖功能以函数的形式提供,其中一个函数为你提供了文件中那些在执行过程中已经被运行过的代码行,另外还有停止和获取代码覆盖信息的函数:
void xdebug_start_code_coverage([int options])
调用这个函数会开始对代码覆盖信息的收集。它有两个选项:XDEBUG_CC_UNUSED和XDEBUG_CC_DEAD_CODE,可以用它们来确定某段代码是否被调用过。
void xdebug_stop_code_coverage( )
调用这个函数可以停止对代码覆盖数据的收集。
array xdebug_get_code_coverage( )
这个函数返回一个多维数组,格式为 $array[filename][line] = numberofcalls。
三、用 Xdebug 进行远程调试
3.1 Xdebug 远程调试的原理
所谓“远程调试”,就是指开发Web程序时,编码与调试端与“远程Web服务器”不在同一台机器上 - 当然这是指逻辑上的。所以首先在网络上,机器需要配置 IP 地址,并从传输层往下要能联通,进行正常通信 - 要能 Ping 得通。
现在,很多 GUI 开发平台,例如 Eclipse、Zend Studio(从7.0开始已经是 built on Eclipse了)等开发工具,已经支持 Web 程序的远程交互式调试功能。Xdebug 自带的命令行调式工具 debugclient 是最原始的远端调试工具(经常在 Linux 下使用)。
开发平台的 IDE 会设置并监听一个调试端口,再在正确安装、配置 Xdebug 的Web服务器上,配置调试端的调试端口,用于 Xdebug 连接时使用(还有一些安全设置)。
调试的时候,调试端IDE访问远程Web服务器(http://IP地址),连通后,远程Web服务器随即利用IDE调试端口与调试端建立反向连接,于是可以进行通信。
由于调试端与远程Web服务器调试的应该是同一段代码,所以IDE端与Web服务器端的 PHP 代码文件必需一致。但路径可以不同。这就存在一个代码文件的同步,和本地路径与远程路径的对应(path mapping)问题。
如果调试端与远程Web服务器是两台物理上独立的机器,则需要在调试前,通过其它渠道(FTP等)进行代码同步。
如果调试端与Web服务器是同一台机器,则最好配置IDE的工程目录与Web服务器的目录指向文件系统的同一个物理文件夹,这样就不存在代码同步的问题了。 - 事实上,强烈建议就这么建立开发和调试环境。
具体以 Zend Studio 7.1 与 Apache2.2(集成PHP5.2.5,并安装了Xdebug)的配置来说明。ZS7.1 与 Apache 安装在同一台机器上。
3.2 Web 服务器端 Xdebug 的有关配置
在前文安装 Xdebug 的基础上,给 [Xdebug] 节添加以下配置语句,其意义如后边的注释所示:
[Xdebug]
xdebug.remote_enable=true ;Xdebug允许远程IDE连接
xdebug.remote_host=127.0.0.1 ;允许连接的IDE的IP地址
xdebug.remote_port=9000 ;反向连接IDE使用的端口
xdebug.remote_handler=dbgp ;用于远程调试的应用层通信协议
xdebug.profiler_enable=On ;允许生成profiler文件
xdebug.profiler_output_dir="D:/_myPHP5_apache/htdocs/xdebug" ;profiler文件输出路径,必须是物理路径
配置修改后,必须重启 Apache 服务。
3.2 Zend Studio 端的配置
打开菜单 Window/Preferences/Debug,“PHP Debugger”选择“XDebug”,可点击后边的“Configure”,选择“XDebug”,基本使用缺省配置就可以。
然后,Server 可以选择默认的,Url 是 http://localhost,如果端口是 8080,可以写成 http://localhost:8080。保存后,这里就配置完毕了。
3.2 调试
Apache 的 localhost 虚拟机的物理路径为 D:/_myPHP5_apache/htdocs/。
在 ZS7.1 里建立新的 PHP 工程,例如命名为 test1,物理路径指定为 D:/_myPHP5_apache/htdocs/test01。test01 文件夹被自动创建。
这样,ZS7.1 的内部文件夹 /test1 就与 Apache 的 http://localhost/test01 虚拟路径建立了映射关系。
使用 ZS7.1 建立 index.php 文件,输入一些 PHP 代码,文件就会位于物理路径 D:/_myPHP5_apache/htdocs/test01 下,亦即 Apache 的虚拟路径 http://localhost/test01 下。
点击 ZS.71 的菜单 Run/Debug Configurations,在 PHP Web Page 下建立调试配置文件,Server Debugger 选择 Xdebug,PHP Server 选择默认的 localhost 服务器,起始调试 File 选择 /test1/index.php,Url 输入成 http://localhost/test01/index.php 的形式。
点击 Debug 按钮,开始进入单步调试模式,淡绿色的光条跳到 PHP 代码的第一行,选中代码面板,按 F5 即可单步执行。
这时,在 D:/_myPHP5_apache/htdocs/xdebug 文件夹下有调试信息文件 cachegrind.out.* 生成,可以用前边介绍的软件阅读分析。
当没有正确配置和(或)联通 Xdebug 时,IDE 界面单步执行按钮和 F5 快捷键是无效的。
ZS7.1 除过与 Xdebug 配合进行远程交互式调试外,还可与 Zend Debugger 进行协同工作。其配置方法与 Xdebug 很相似。
在 Zend Server 5.x 中包含了 Zend Debugger 的扩展包,Zend Server 5.x 企业版(收费的)中还包含了输出错误调试信息的功能,在 ZS7.1 界面里可以直接下载浏览这些错误信息。
作者:张庆(网眼) 西安 PHP 教育培训中心 2010-7-7
来自“网眼视界”:http://blog.why100000.com
作者微博:http://t.qq.com/zhangking
“十万个为什么”电脑学习网:http://www.why100000.com