清单 7 显示了 var_dump() 的输出。
清单 7. var_dump() 输出
object(person)
var 'name' => string 'Joe' (length=3)
var 'surname' => string 'Smith' (length=5)
var 'age' => int 4
var 'children' =>
array
empty
object(person)
var 'name' => string 'Mary' (length=4)
var 'surname' => string 'Smith' (length=5)
var 'age' => int 34
var 'children' =>
array
0 =>
object(person)
var 'name' => string 'Joe' (length=3)
var 'surname' => string 'Smith' (length=5)
var 'age' => int 4
var 'children' =>
array
empty
1 =>
object(person)
var 'name' => string 'Jane' (length=4)
var 'surname' => string 'Smith' (length=5)
var 'age' => int 6
var 'children' =>
array
empty
|
如果结合使用 Xdebug 与 PHP V5 类,转储包括 public、private 和 protected 之类的属性。
解决错误 —— 如解开神秘谋杀之谜 —— 通常要求构造详细的时间线。例如,内存泄漏通常不会把自身表明为一个错误计算。相反,操作将正常进行,直至内存用尽,然后应用程序突然终止。如果内存泄漏由于某些请求而恶化,可能会不断出现错误并且难以预测。在内存使用量与时间之间建立映射的时间线将揭示泄漏的严重程度。一条精细的时间线 —— 比如,从函数到函数 —— 将进一步指出泄漏源。
Xdebug 可以提供一条详细的时间线进行执行跟踪。当跟踪被启用后,Xdebug 将记录所有函数调用,包括每个函数的参数和返回值。您可以将每个日志或跟踪 的格式设为符合人类阅读习惯或者机器可读的格式。您最好使用前者,虽然您可能编写独立而特定的应用程序来分析后者。
同转储一样,Xdebug 有若干个 php.ini 选项用于自定义跟踪内容。例如,下面一批设置将生成最详细的输出。
清单 8. 跟踪自定义
xdebug.trace_format = 0 xdebug.auto_trace = On xdebug.trace_output_dir = /tmp/traces xdebug.trace_output_name = trace.%c.%p xdebug.collect_params = 4 xdebug.collect_includes = On xdebug.collect_return = On xdebug.show_mem_delta = On |
设定 xdebug.auto_trace = 1 将在执行所有 PHP 脚本之前先启用自动跟踪。另外,您可以通过代码设定 xdebug.auto_trace = 0,并分别使用 xdebug_start_trace() 和 xdebug_stop_trace() 函数启用和禁用跟踪。但是,如果 xdebug.auto_trace 为 1,则可以在包括配置好的 auto_prepend_file 之前先启动跟踪。
选项 xdebug.trace_ouput_dir 和 xdebug.trace_output_name 用于控制保存跟踪输出的位置。在这里,所有文件都被保存到 /tmp/traces 中,并且每个跟踪文件都以 trace 为开头,后接 PHP 脚本的名称(%s)以及进程 ID(%p)。所有 Xdebug 跟踪文件都以 .xt 后缀结尾。
默认情况下,Xdebug 将显示时间、内存使用量、函数名和函数调用深度字段。如果将 xdebug.trace_format 设为 0,则输出将符合人类阅读习惯(将参数设为 1 则为机器可读格式)。此外,如果指定 xdebug.show_mem_delta = 1,则可以查看内存使用量是在增加还是在减少,而如果指定 xdebug.collect_params = 4,则可以查看传入参数的类型和值。要监视每个函数返回的值,请设定 xdebug.collect_return = 1。
接下来看另外一个示例。创建 /tmp/traces 目录,然后用 mkdir /tmp/traces; chmod a+rwx /tmp/traces 将其模式更改为能够被任何用户阅读的文件(world-readable)和能够被任何用户写入的文件(world-writable)(如果您不愿共享 traces 目录,请确保至少 Web 服务器用户 —— 通常为 www 或任何人 —— 可以将数据写入该目录)。将以上跟踪设置添加到 php.ini 文件中,重新启动 Web 服务器,然后把浏览器再次指向 phpinfo() 应用程序。整个跟踪应当类似清单 9 所示:
清单 9. 整个跟踪
TRACE START [2007-06-06 14:04:55]
0.0003 9440 +9440 -> {main}() /var/www/catalog/t/info.php:0
0.0005 9440 +0 -> phpinfo() /var/www/catalog/t/info.php:1
>=-> TRUE
>=-> 1
0.2351 9208
TRACE END [2007-06-06 14:04:55]
|
在这里,main() 将调用 phpinfo(),后者将返回 TRUE。当 main() 退出时,它将返回 1。接下来,将浏览器指向 “最复杂的内容” 或系统中的其他某个 PHP 应用程序以生成更详细的跟踪。
清单 10 显示了在计算第四个斐波纳契数列时上一篇文章中的 PHP Fibonacci 生成器的跟踪:
清单 10. PHP Fibonacci 生成器跟踪
TRACE START [2007-06-06 14:17:17]
0.0004 16432 +16432 -> {main}() /var/www/catalog/t/fibonacci.php:0
0.0006 16696 +264 -> fib('4') /var/www/catalog/t/fibonacci.php:35
0.0007 16696 +0 -> fib(3) /var/www/catalog/t/fibonacci.php:7
0.0007 16736 +40 -> fib(2) /var/www/catalog/t/fibonacci.php:7
0.0007 16848 +112 -> fib(1) /var/www/catalog/t/fibonacci.php:7
>=> 1
0.0008 16904 +56 -> fib(0) /var/www/catalog/t/fibonacci.php:7
>=> 0
>=> 1
0.0009 16904 +0 -> fib(1) /var/www/catalog/t/fibonacci.php:7
>=> 1
>=> 2
0.0009 16904 +0 -> fib(2) /var/www/catalog/t/fibonacci.php:7
0.0009 16904 +0 -> fib(1) /var/www/catalog/t/fibonacci.php:7
>=> 1
0.0010 16904 +0 -> fib(0) /var/www/catalog/t/fibonacci.php:7
>=> 0
>=> 1
>=> 3
>=> 1
0.0011 12528
TRACE END [2007-06-06 14:17:17]
|
第一列显示时间,第二列是累计的内存使用量,第三列是增加的内存使用量,而第四列显示函数调用,包括参数。
标有 >=> 的行显示每个函数的返回值(查找相应的缩进 -> 将调用与其返回值匹配起来)。此外,最后的 >=> 1 是 main() 的返回值。
如果使用 vim,Xdebug 的创造者 Derick Rethans 提供了专门针对 Xdebug 跟踪的一组语法加亮提示。提示包含在 Xdebug 源代码包内的 xt.vim 文件中。对于最近的 Linux 发行版,只需将 xt.vim 复制到 $VIMRUNTIME/syntax/xt.vim 中,然后运行 vim tracefile.xt。图 4 显示了 vim 中加亮的 Fibonacci 跟踪。
图 4. Xdebug 跟踪的 vim 语法文件将使您可以轻松地进行分析
跟踪 PHP 代码中的错误可能是一项挑战。但是如果您有开发系统并且可以安装 Xdebug,那么更正这些错误就会变得轻松得多。Xdebug 可以显示堆栈跟踪,转储甚为复杂的变量,随时间跟踪内存使用量,并允许您在出错或崩溃时(不是如果,而是发生时)进行有效的事后分析。
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- 访问 Xdebug.org。
- 阅读 Xdebug 文档。
- 在 developerWorks 文章 “为 PHP 应用提速、提速、再提速!,第 2 部分: 分析 PHP 应用程序以查找、诊断和加速运行缓慢的代码” 中了解 Xdebug 的更多用法。
- PHP.net 是 PHP 开发者的主要资源。
- 查阅 “PHP 推荐读物列表”。
- 浏览在 developerWorks Open source 专区中可获取的所有 PHP 文章 和 PHP 免费教程。
- 查阅 IBM developerWorks 的 PHP 项目资源 扩展 PHP 技巧。
- 收听针对软件开发人员的有趣访谈和讨论,一定要访问 developerWorks podcast。
- 要将数据库与 PHP 结合使用?查看 Zend Core for IBM,它是支持 IBM DB2 9 的无缝、即用且易于安装的 PHP 开发和生产环境。
- 随时关注 developerWorks 的 技术事件和网络广播。
- 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、展览、网络广播和其他 活动。
- 访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
- 查看免费的 developerWorks On demand demo 观看并了解 IBM 及开源技术和产品功能。
获得产品和技术
- 下载 Xdebug 扩展。
- 使用 IBM 试用软件 改进您的下一个开发项目,这些软件可以通过下载或从 DVD 中获得。
- 下载 IBM 产品评估版,并开始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
- 加入 Xdebug 邮件列表(单击此链接将启动您的默认邮件客户机)。
- 参与 developerWorks blog,加入 developerWorks 社区。
- 加入 developerWorks PHP Forum: Developing PHP applications with IBM Information Management products (DB2, IDS)。
|
|
Martin Streicher 是 McClatchy Interactive 的首席技术官、Linux Magazine 的主编、Web 开发人员以及 developerWorks 的定期投稿者。他毕业于普渡大学并获得计算机科学硕士学位,从 1986 年起他一直从事类 UNIX 系统的编程工作。 |
|
