可能只有我有这种体验,但是我经常发现调试 CLI 程序会演变成一场噩梦,尤其是处理嵌入了 HTML 的脚本,例如 Microsoft® Active Server Pages (ASP) 或 PHP。通常很难判断特定错误消息所表达的精确含义,用户输入可能很难再次生成,并且整件事通常会使您头痛的希望拔光头发。
不幸的是,虽然足够聪明的程序员可以找到 CLI 能够有所帮助的方法(例如,通过从文件读取输入或通过一个通道的另一个程序),但是大部分问题都不会由于使用命令行而显著减弱。不过,CLI 确实使一件事变得更加简单:找到错误消息,以便可以在第一位置读取这些错误消息。
为了查看使用命令行调试的值,让我们从下面所示的非常非常糟糕的 PHP 文件开始。
#!/usr/bin/php -q Don<'t>code<?php while drunk(); ?<虽然第一眼看到代码时,就发现这个脚本中的一些错误十分明显,但是代码在 Web 浏览器中提供了无用调试信息的极好示例。尤其是,不会发生这种情况:在 Apache 中运行此页面只是得到了根本没有输出的结果。如果错误不明显,那么您怎样找到错误原因?
解决这个问题的传统方法是查看错误日志。例如,您可能先运行:
tail -f /var/log/httpd/error_log然后再将页面装入运行 Apache 2 的 Linux 系统,这将得到诸如下面的输出:
[client 127.0.0.1] PHP Parse error: parse error, unexpected T_STRING, expecting '(' in /var/www/html/dont-code-drunk.php on line 2不幸的是,您可能同意我的观点,考虑这种不太理想的解决方案。一方面,文件日志位置可能因系统的不同而有所不同。另一方面,您必须浏览不相关事件的日志以查找所需内容,这对于活动的服务器来说很可能是一场噩梦。
此时,您可能和我曾经想的一样:一定会有更好的方法。
使用 CLI 定位并修正错误
通过直接在 CLI 上运行脚本,可以轻松地分离出代码中存在的问题。运行:
php dont-code-drunk.php结果,可能会得到以下输出:
PHP Parse error: parse error, unexpected T_STRING, expecting '(' in /var/www/html/dont-code-drunk.php on line 2 Content-type: text/html X-Powered-By: PHP/4.3.11更棒了!错误消息已与其他数据分离,并且在做出更改后可以轻松地重新查看页面。在这种情况下,很清楚它在行中某个位置需要 '('。while 语句看似适合用在这里,因此添加一组新括号,得到以下源代码。
#!/usr/bin/php -q Don<'t>code<?php while (drunk()); ?<现在,再次运行代码将得到以下输出:
清单 1. 再次运行结果
脚本仍有很多问题,但是您已经取得了一些进展。您已经相对轻松地提取到了所需的错误消息,使您可以快速修正程序中的问题并继续处理下一个问题。
全然使用 PHP 的任何人都可以以这种方式充分利用 CLI PHP 进行调试。但是为什么不进一步伸展您自己并开始用 PHP 真正实现 shell 脚本?向前迈进,并且您将会看到将 PHP 用于简单或者不那么简单的 shell 脚本的一些可能性。