PHP程序员调试技术总结
本文介绍了调试PHP应用程序的各种方法,包括在Apache和PHP中打开错误报告,以及通过在简单的PHP脚本中放置战略性打印语句来查找更难的bug的来源。还介绍了Eclipse的PHPEclipse插件,这是一个灵活的开发环境,具有实时语法解析能力,并介绍了PHPEclipse的DBG调试器扩展。有许多PHP调试技术可以在编码时节省大量时间。一种有效但基本的调试技术是打开错误报告。另一种稍微高级一点的技术包括使用print语句,这有助于通过显示屏幕上实际出现的内容来发现更难准确发现的bug。PHPEclipse是一个Eclipse插件,它可以强调常见的语法错误,并可以与调试器结合设置断点。要设置和学习本文中描述的概念,您需要PHP、Web服务器和Eclipse。调试器扩展支持的PHP版本是V5.0.3我们需要一个Web服务器来解析用PHP创建的页面,并将它们显示给浏览器。本文中使用了Apache2。但是,任何Web服务器都可以满足要求。要使用本文介绍的一些调试技术,需要安装Eclipse V3.1.1和插件PHPEclipse V1.1.8。由于Eclipse需要Java技术,所以也应该下载它。您还需要一个PHP调试器扩展。安装起来有点麻烦。请按照说明小心安装调试器扩展。现在,注释掉php.ini文件中需要加载和配置PHP扩展的行。需要使用调试器时取消注释。有关下载信息,请参考参考资料。现在介绍错误信息。错误消息是开发人员的第一道防线。没有人想在没有配置为显示错误消息的服务器上用PHP开发代码。但是,请记住,在调试代码并准备运行时,您应该确保关闭错误报告,因为您不希望网站的访问者看到错误消息,因为这将为他们提供足够的信息来利用网站的弱点并黑客攻击网站。您还可以为自己提供错误消息,因为它们显示了抛出或生成错误的正确代码行。这样,调试就变成了在浏览器中查看由生成的错误显示的行号,并在代码中检查这一行。稍后,我们将看到PHPEclipse插件可以在开发和调试过程中提供很大的帮助,它可以在保存文件时立即在语法错误下面加下划线,并用红色的“x”标记语法错误。我们先来看看如何在php.ini文件中打开错误报告,并设置错误报告的级别。然后,您将学习如何在Apache的配置文件中覆盖这些设置。PHP的错误报告php.ini文件中有很多配置设置。您应该已经设置好您的php.ini文件,并将其放在适当的目录中,如在Linux上安装php和Apache 2的文档所示(参见参考资料)。调试PHP应用程序时,应该知道两个配置变量。下面是这两个变量及其默认值:复制代码如下: display _ errors=offer ror _ reporting=e _ all通过在php.ini文件中搜索它们,可以找到这两个变量的当前默认值。display_errors变量的目的显而易见。——它告诉PHP是否显示错误。默认值为关闭。但是,为了使开发过程更容易,请将该值设置为“开”:复制代码如下: Display _ Errors=On Error _ Reporting变量的默认值是E_ALL。此设置将显示从不良编码实践到无害错误提示的所有信息。E_ALL对于开发过程来说有点太详细了,因为它还会在屏幕上显示小事情的提示(比如变量没有初始化),这会破坏浏览器的输出。我只想看到错误和糟糕的编码实践,但我不想看到无害的提示。因此,请将error_reporting的默认值替换为以下值:复制代码如下: error _ reporting=e _ all ~ e _ notice重启Apache,全部设置好。接下来,我将学习如何在Apache上做同样的事情。
服务器上的错误报告取决于Apache正在做什么。用PHP打开错误报告可能不起作用,因为计算机上可能有多个PHP版本。有时候很难分辨Apache使用的是哪个PHP版本,因为Apache只能查看一个php.ini文件。知道Apache使用哪个php.ini文件来配置自己是一个安全问题。但是,有一种方法可以在Apache中配置PHP变量,以确保设置了正确的错误级别。此外,最好知道如何在服务器端设置这些配置变量来拒绝或抢占php.ini文件,从而提供更高级别的安全性。在配置Apache时,您应该已经在Apache 2-install-dir/conf/httpd . conf中的http.conf文件中接触到了基本配置.要执行在php.ini文件中已经完成的操作,请在http PD . conf中添加以下行并覆盖任何php.ini文件:复制代码如下: PHP _ flag display_errors on PHP _ value error _ report 2039这将覆盖php.ini文件中为display _ errors和error_reporting的值设置的标志。2039的值代表E_ALL ~E_NOTICE。如果您愿意采用E_ALL,请将值设置为2047。再次,重启Apache。接下来,在服务器上测试错误报告。测试错误报告如果启动错误报告,将节省大量时间。PHP中的错误指向代码中的错误。请创建一个简单的PHP文件test.php,并定义它,如清单1所示。清单1。一个简单的生成错误的PHP复制代码如下:php print('下一行生成错误. br ');printa line(' POWER '?);打印('由于上述错误,这将不会显示。');第一个print()语句向Web浏览器显示其内容。但是,第二条语句会生成一个错误并将其显示在网页上。这导致最后一个print()语句无效,如图1所示。1.生成错误。
错误报告现已开启!接下来,使用print语句帮助调试应用程序。print语句简介因为应用程序中的函数bug不会产生错误,所以如何正确放置和使用print或die语句来调试PHP应用程序的知识在所有调试策略中都是一项很好的资产。您可以使用print语句来缩小问题语句在代码中的位置。这些语句没有语法错误,也不是bug,但就代码的功能而言,它们是bug。这些bug最难发现和调试,因为它们不会抛出错误。我唯一知道的是,浏览器上显示的内容不是我想要的,或者我想保存在数据库中的内容根本没有保存。假设您正在处理GET请求发送的表单数据,并希望向浏览器显示信息,但由于某种原因,数据没有正确提交,或者无法从GET请求中正确读取。要调试这类问题,重要的是要知道print()或die()语句的变量值是多少。die()语句中止程序执行,并在网络浏览器上显示文本。如果不想注释掉代码,只想显示错误前后的信息,而不想显示错误后的信息,那么die()语句特别有用。让我们用PHP中的print语句来测试这个概念。当我还是程序员的时候,当我在Linux上开发应用程序的时候,没有方便的GUI来告诉我bug在哪里。我很快发现,我在程序中放入的打印语句越多,我就越有可能将bug的范围缩小到应用程序中的一行。请创建另一个PHP文件test2.php,并定义它,如清单2所示。清单2。显示通过GET提交的所有变量复制代码。代码如下:php $ j=打印(“让我们检索提交到此的所有变量”);打印(“通过GET请求编写脚本: br”);foreach($ _ GET as $ key=$ I){ print($ key=$ jbr ');}如果($_GET['提交']=='发送GET请求')$j='完成!br ';method=' get ' name : input name=' name ' bremail : input name=' email ' size=' 25 ' br input name=' submit ' type=' submit ' value=' send get request '/form您可能会非常容易地发现清单2中的错误!你太棒了!但是请注意,这是一个非常简单的脚本,只是用print语句调试的一个例子。这个脚本只是提取GET请求中的所有变量,如果有的话,在浏览器上显示它们。还提供了一个表单,通过GET请求将变量发送到服务器进行测试。查看输出,如图2所示。图2。test2.php输出。
现在点击发送GET请求按钮,请注意浏览器上只显示$_GET请求的键,没有显示正确的值。您可以在循环中放一个print语句来验证foreach循环中的每个元素中是否真的存在数据。请参见清单3。清单3。用print语句验证代码的功能。复制代码如下:foreach ($ _ get as $ key=$ i) {print('正确的数据?'。$_GET[$key]。br’);print(' $ key=$ jbr ');} .放入的打印语句是粗体的。请注意,现在已经知道Web浏览器上显示的$key值是正确的,但是由于某些原因,该值没有正确显示。查看新的输出,如图3所示。图3。修改后的test2.php输出。
既然您已经知道应用程序正确地从GET请求中接收到了变量,那么代码中一定有错误。检查后,我注意到用于显示值的变量$j是错误的。在foreach语句中,指定了$i,因此它肯定具有正确的值,但是$j是无意中输入的。因此,通过用$i替换$j,错误被迅速纠正,在重新加载页面后,可以看到正确的输出,如图4所示。图4。test2.php订正产出。
现在,您可以删除或注释掉刚刚添加的print语句,因为您在代码中发现了错误。请注意,这只是调试应用程序时可能遇到的许多错误中的一小部分。对于使用数据库时可能遇到的问题,一个好的解决方案是输出SQL语句,以确保执行的SQL正是您想要执行的。现在让我们看看如何使用Eclipse IDE和PHPEclipse插件和调试器扩展来进一步帮助调试过程。使用PHPEclipse您可能使用过Eclipse,但可能不熟悉它。有关Eclipse平台的介绍,请参见参考资料。Eclipse的PHPEclipse插件是开发PHP应用程序的流行工具。请启动Eclipse并将工作区目录指定为Apache的www目录(c:\www在我的机器上)。立即单击文件新建项目。将弹出“新建项目”向导。双击PHP文件夹,选择PHP项目。单击下一步,输入项目名称debugArticle,然后单击完成。如果网络服务器设置为监听端口80,则不需要修改。否则,转到导航器窗口,右键单击PHP项目调试工具,选择属性,然后单击PHP项目设置。单击配置工作区设置,并修改适当的本地主机或添加网络服务器侦听的端口(例如,http://本地主机:8080)。单击应用完成设置。“导航器”窗口应该显示项目和. project文件。右键单击项目,就像以前一样,只是这次,选择新建PHP文件。替换*。用你想要创建的PHP文件的名字test3.php,然后点击完成。Eclipse集成开发环境中应该会出现一个新文件。您可能需要导航到窗口底部的PHP浏览器来查看PHP文件的当前输出(参见图5)。图5。Eclipse的PHPEclipse插件。
注意,只有Windows用户可以使用PHP浏览器,如清单5所示。您也可以通过打开单独的浏览器窗口并将浏览器指向测试脚本所在的目录来使用相同的功能。现在让我们演示这个应用程序,并证明其强大的能力。在“使用调试器”一节中,您将学习如何使用Eclipse、PHPEclipse和之前下载的调试器PHP扩展来调试PHP应用程序。首先学习如何使用它的解析功能。解析和下划线从查看PHPEclipse如何提供实时解析来帮助调试PHP应用程序开始。要查看这个特性的实际应用,首先在Eclipse中定义test3.php,如下所示。phpprint(,' Hello World!');请注意,清单4中带下划线的两个字符在Eclipse中带下划线,这表明语法不正确。按Ctrl+S保存文件,解析错误会在Eclipse中显示出来:代码中解析错误对应的行会添加一个红色的“x”,如图6所示。6.强调语法错误。
现在演示一下PHP浏览器。该窗口提供了当前PHP脚本的预览,如图6所示。从上面定义的test3.php中删除逗号(,)。按Ctrl+S保存文件,然后观察PHP浏览器窗口的更新,显示Hello World(见图7)。图7。在PHPEclipse 中预览PHP脚本。
下面是用调试器在PHP中设置断点。使用调试器使用调试器,您可以在PHP代码到达设置的断点之前设置断点并查看浏览器输出。然后可以继续执行代码,查看下一个断点之前的浏览器输出,然后转到下一个断点,直到PHP脚本完成。现在取消注释php.ini中“设置”部分注释掉的行,并重新启动Apache。现在调试器已经加载,Eclipse可以将其连接起来。现在在Eclipse中设计调试环境。请创建一个新的test4.php文件,并将其留空。单击立即运行调试。在左侧面板中选择PHP DBG脚本,然后单击新建。现在转到文件选项卡,输入当前项目的调试文件和您想要调试的文件test4.php。现在转到环境选项卡,然后转到解释器子选项卡。在PHP的安装目录中,找到php.exe文件(我的是c:\apps\php5.0.3\php.exe)。单击远程调试子选项卡,然后选择远程调试。如果不使用Windows,请取消“在内部浏览器框中用dbg会话URL打开”的复选框。将远程源路径设置为与要测试的PHP脚本的绝对路径(不是Web路径)相同(我的设置是c : \ www \ debugarticle \ test4 . PHP)。单击“立即调试”。现在应该加载调试透视图,如图8所示。否则,单击窗口打开透视其他并选择调试。图8。Eclipse中的调试视角。
您现在可以设置断点。对于本文中使用的插件和扩展版本,断点函数是必要的,因为PHP在将输出发送到浏览器之前会对其进行缓冲。另外,需要做的不仅仅是设置一个断点,将当前显示的数据刷新到Web浏览器中,所以test4.php应该定义如下图和图8所示。清单4。设置和创建断点?phpfunction断点(){ ob _ flush();flush();睡眠(. 1);debugBreak();}打印('这将首先显示');print(' this br也会这样');断点();打印(“这在之后才会显示”);print('继续断点br ');断点();打印(' END!');断点()函数将缓冲的输出和其他缓冲的数据刷新到网络浏览器。需要调用sleep(.1),以便在代码停止在debugBreak()之前,服务器有足够的时间将数据刷新到Web浏览器。这个函数是之前下载的PHP调试器扩展的内部函数。这样,调用断点()会将HTML块、print()和echo()语句的数据刷新到浏览器,然后停止代码执行。编写完如清单4所示的代码后,您可以打开浏览器并指向test4.php,或者查看PHP浏览器窗口(我的是http://localhost/debugarticle/test4 . PHP)。每次导入和保存文件时,调试序列已经在PHP浏览器窗口中启动。如果您没有使用Windows,请通过浏览器查看test4.php。保存文件后,使用F8或单击运行恢复继续代码执行。继续这样做,直到输出的最后一行是END!直到(见图9、10和11)。图9。初始PHP浏览器输出到第一个断点。
请注意图9中的调试窗口如何将执行显示为挂起。图10。第一个断点之后第二个断点之前的PHP浏览器输出。
图10中的调试窗口仍然显示执行挂起,而第二组数据显示在PHP浏览器中。图11。完成PHP浏览器输出。
请注意,图11中调试窗口中的代码不再被挂起,整个脚本已经被执行,如图11中的PHP浏览器所示。现在您已经看到了使用PHPEclipse和调试器扩展进行开发的优势,很难想象没有它会发生什么。结论在PHP的调试技术中加入了错误报告、打印语句、PHPEclipse和调试器扩展的应用。通过减少每行代码的错误数量,您可以成为更有效的PHP编码员。参见参考资料中的一些PHP教程,您可以在其中测试这些新技能。下载PHP调试参考学习示例代码您可以在developerWorks全球网站上查阅本文的英文原文。了解如何在基于Windows和UNIX的系统上安装Java。请访问Eclipse.org,了解关于编程和如何使用编程的全面信息。《Eclipse平台简介》(developerWorks,2002年11月)提供了Eclipse的历史和概述,包括如何安装Eclipse和插件的细节。请访问PHPEclipse,了解有关安装PHPEclipse以及如何使用它的更多信息。DBG是一个功能齐全的PHP调试器引擎和交互工具,对调试PHP脚本很有帮助。请阅读关于安装和配置调试器的本教程。要了解关于Eclipse的更多信息,请访问developerWorks中的Eclipse项目资源。要了解更多关于PHP的信息,请访问developerWorks中的PHP项目资源。有关错误报告的更多信息,请参见PHP手册。请阅读在Linux上安装PHP和Apache2的说明。请阅读在Windows上安装PHP和Apache2的说明。要获得一系列学习PHP编程的developerWorks教程,请参考“学习PHP,第1部分”、“学习PHP,第2部分”和“学习PHP,第3部分”。密切关注developerworks技术活动和网络广播。请访问developerWorks开源专区,获取丰富的操作方法信息、工具和项目更新,有助于用开源技术开发并应用到IBM产品中。对于产品和技术,请从PHP.net下载最新版本的PHP。请下载最新版本的Apache 2。请从太阳公司下载Java技术。请从Eclipse.org下载最新版本的Eclipse。请从Sourceforge下载PHPEclipse。将Eclipse解压到eclipse-install-dir,然后将PHPEclipse解压到eclipse-install-dir。安装扩展时,请遵循PHPEclipse说明。但是,注释掉那些需要在php.ini文件中加载和配置PHP扩展的行。准备好使用调试器时,请取消对这些行的注释。免费订购SEK Linux。这张DVD(两张)包含了来自DB2、Lotus、Rational、Tivoli和WebSphere的最新的IBM Linux试用软件。请使用IBM试用软件改造您的下一个开源开发项目,可以下载或通过DVD获得。通过讨论和参与developerWorks博客,加入developerWorks社区。关于作者
泰勒安德森于2004年毕业于杨百翰大学,获得计算机科学学位。现在是他作为计算机工程硕士研究生的最后一个学期。过去,他为DPMG.com工作,是一名数据库程序员,现在他是俄勒冈州比弗顿的斯特萨尔公司的工程师。原地址:http://www.ibm.com/developerworks/cn/opensource/os-debug/
版权声明:PHP程序员调试技术总结是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。