当前位置:中国站长下载文章中心网页编程PHP编程 → PHP程序员的优化调试技术和技巧

PHP程序员的优化调试技术和技巧

减小字体 增大字体 作者:编辑整理  来源:互联网  发布时间:2008-9-15 22:05:13
..foreach($_GETas$key=>$i){print("Correctdata?".$_GET[$key]."<br>");print("$key=$j<br>");}...


放进去的print语句是粗体。注意,现在已经知道在Web浏览器上显示的$key值是正确的,但是由于某些原因,值没有正确地显示。请看新的输出,如图3所示。

图3.修改后的test2.php的输出
php的输出"src="/upimg/allimg/080908/0838412.jpg"width=572 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

现在已经知道应用程序正确地从GET请求接收到了变量,那么肯定是在代码中有bug。查看之后注意到,用来显示值的变量$j是错误的。在foreach语句中指定的是$i,所以它肯定会有正确的值,但是无意之中输入了$j。所以通过把$j替换成$i,迅速地修正了错误,重新载入页面之后,就看到了正确的输出,如图4所示。

图4.修正后的test2.php的输出
php的输出"src="/upimg/allimg/080908/0838413.jpg"width=572 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

现在可以删除或注释掉刚才添加的print语句了,因为已经发现了代码中的bug。注意,这只是在调试应用程序时可能遇到的许多错误中的一个很小的子集。对于使用数据库时可能遇到的问题,一个好的解决方案是输出SQL语句,以确保执行的SQL就是想要执行的。

现在要来看看如何使用EclipseIDE和PHPEclipse插件及调试器扩展进一步在调试历程中提供帮助。

使用PHPEclipse

您可能用过Eclipse,但是可能不熟悉它。请参阅参考资料获得Eclipse平台的介绍。

用于Eclipse的PHPEclipse插件是用来开发PHP应用程序的一个流行工具。请启动Eclipse并把工作区目录指定为Apache的www目录(在我的机器上是c:\www)。现在单击File>New>Project。会弹出NewProject向导。双击PHP文件夹并选择PHPProject。单击Next,输入项目名称debugArticle,并单击Finish

如果把Web服务器设置为在端口80上侦听,那么不需要做任何修改。否则,请转到Navigator窗口,在PHP项目debugArticle上右击,选择Properties,然后单击PHPProjectSettings。单击ConfigureWorkspaceSettings然后修改合适的localhost或者添加Web服务器侦听的端口(例如http://localhost:8080)。单击Apply完成设置。

Navigator窗口应当显示项目和一个.project文件。在项目上右击,就像前面做的那样,只是这次选择New>PHPFile。用想要创建的PHP文件的名称test3.php替换*.php,然后单击Finish。在EclipseIDE中应当出现一个新文件。可能需要导航到窗口底部的PHP浏览器来查看PHP文件的当前输出(参见图5)。

图5.Eclipse的PHPEclipse插件
PHPEclipse插件"src="/upimg/allimg/080908/0838414.jpg"width=572 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

注意,只有Windows?的用户可以像清单5所示的那样使用PHP浏览器。通过打开独立浏览器窗口并把浏览器指向测试脚本所在目录,也可以使用同样的功能。

现在来演示这个应用程序,证明它的强大能力。

在“使用调试器”一节中,将学习如何用Eclipse、PHPEclipse和前面下载的调试器PHP扩展来调试PHP应用程序。先从学习如何使用它的语法解析功能开始。

语法解析和加下划线

先从查看PHPEclipse如何提供帮助调试PHP应用程序的实时语法解析功能开始。要看这个特性的实际应用,先从在Eclipse中定义test3.php开始,如下所示。

<?phpprint(,"HelloWorld!");?>


注意,在清单4中加下划线的两个字符在Eclipse中加了下划线,提示语法不正确。按Ctrl+S保存文件,会在Eclipse中显示解析错误:在代码中与解析错误对应的行上会加上红“x”,如图6所示。

图6.语法错误强调


现在演示PHP浏览器。这个窗口提供了当前PHP脚本的预览,如图6所示。

从上面定义的test3.php中删除逗号(,)。按Ctrl+S保存文件,然后观察PHP浏览器窗口的更新,显示了HelloWorld(参见图7)。

图7.在PHPEclipse中预览PHP脚本
PHPEclipse中预览PHP脚本"src="/upimg/allimg/080908/0838416.jpg"width=572 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

下面是用调试器在PHP中设置断点。

使用调试器

使用调试器,可以设置断点并查看PHP代码到所设断点之前的浏览器输出。然后可以继续代码的执行并查看到下一断点之前的浏览器输出,然后再到下一个,直到PHP脚本完成。

现在把“设置”一节中在php.ini中注释掉的行取消注释,并重新启动Apache。现在装入了调试器,Eclipse能够和它挂上了。

现在在Eclipse中设计调试环境。请创建新的test4.php文件,先保持为空。现在单击Run>Debug。在左侧面板中选择PHPDBGScript,并单击New。现在转到File选项卡,输入当前项目debugArticle以及想要调试的文件test4.php。现在转到Environment选项卡,然后再到Interpreter子选项卡。在PHP的安装目录中找到php.exe文件(我的是c:\apps\php5.0.3\php.exe)。现在单击RemoteDebug子选项卡,选择RemoteDebug,如果没有使用Windows,请取消“OpenwithDBGSessionURLininternalbrowserbox”复选框。把RemoteSource路径设置成与要测试的PHP脚本的绝对路径(不是Web路径)相同(我的设置是c:\www\debugArticle\test4.php)。现在单击Debug

现在应当装入Debug透视图,如图8所示。否则,请单击Window>OpenPerspective>Other,并选择Debug

图8.Eclipse中的Debug透视图


现在可以设置断点了。

对于本文中使用的插件和扩展的版本,断点功能是必需的,因为PHP在把输出发送到浏览器之前会缓冲它。除此之外,需要做的不仅仅是设置一个断点把当前显示数据刷新到Web浏览器,所以要像下面和图8所示那样定义test4.php

清单4.设置和创建断点
<?phpfunctionbreak-point(){ob_flush();flush();sleep(.1);debugBreak();}print("Thiswillgetshownfirst,");print("aswillthis<br>");breakpoint();print("Thiswon'tgetshownuntilafter");print("continuingthebreak-point<br>");breakpoint();print("END!");?

breakpoint()函数会把缓冲的输出和其他缓冲的数据刷新到Web浏览器。对sleep(.1)的调用是必需的,这样代码中止于debugBreak()之前,服务器才有足够的时间把数据刷新到Web浏览器,这个函数是前面下载的PHP调试器扩展的内部函数。这样,调用breakpoint()会把HTML块、print()和echo()语句的数据刷新到浏览器,然后中止代码执行。

在像清单4那样编写完代码之后,可以打开浏览器并指向test4.php,或者可以查看PHP浏览器窗口(我的是http://localhost/debugArticle/test4.php)。每次输入和保存文件时,在PHP浏览器窗口中就已经启动了调试序列。如果不使用Windows,请通过浏览器查看test4.php。在保存了文件之后,用F8或单击Run>Resume继续代码执行。持续这么做,直到最后一行输出是END!为止(参见图9、10和11)。

图9.初始的到第一个断点的PHP浏览器输出
PHP浏览器输出"src="/upimg/allimg/080908/0838418.jpg"width=572 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

请注意图9中的Debug窗口如何把执行显示为挂起的。

图10.第一个断点之后到第二个断点之前的PHP浏览器输出
PHP浏览器输出"src="/upimg/allimg/080908/0838419.jpg"width=600 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

图10的Debug窗口仍然把执行显示为挂起,而第二组数据显示在PHP浏览器中。

图11.完整的PHP浏览器输出
PHP浏览器输出"src="/upimg/allimg/080908/08384110.jpg"width=572 onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"/>

注意,图11的Debug窗口中的代码不再挂起,整个脚本已经执行,如图11中的PHP浏览器所示。

既然已经看到了用PHPEclipse和调试器扩展进行开发的优势,那么很难想像没有它会怎么样。

结束语

现在已经向PHP的调试技术集中添加了错误报告的运用、print语句、PHPEclipse和调试器扩展,您可以通过减少每行代码的错误数量,成为更有效的PHP编码人员。请参阅参考资料获得一些PHP教程,可以在上面测试这些新技能。

上一页  [1] [2]