PHP程序员的调试技术_第1页
PHP程序员的调试技术_第2页
PHP程序员的调试技术_第3页
PHP程序员的调试技术_第4页
PHP程序员的调试技术_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP程序员的调试技术(fromibm)

最简单的谁都会的调试(是么?):

本来安装php是没问题也能用了但是又从书上抄了些代码来发现不能用,那就用眼睛

仔细的对着书本纠正•下代码哈肯定是你抄错了要么是印刷错了

比如1(yi)跟l(el)O(ling)跟0(大写o)等

别笑哈真的有人抄错过还让我过去帮忙调试过去我录入进去(他的没保存)就全对了

言归正传

Q:"为什么要调试?”

A:当然是因为程序错啦.你以为我有什么别的答案?

Q:"可是我觉得我的程序应该没错啊!”

A:不能出来期望的结果当然是错误发生.有这种思想的人是根本不具备调试观念更没有

调试能力.

Q:那调试有什么用?

A:不管是你配置的php出错还是你的程序写错还是你写的正确的程序跟别人配置的

php(比如免费空间)犯冲,学会调试都能找出原因来

Q:逻辑乱了能调试好么?

A:或许你偶尔改来改去改好了以为是调试好了其实那已经不是单纯的调试,而是反复的

用程序代码进行思考,并且反复的改代码来"实践"某个idea是否可行.

可以说是"调试逻辑"而非"调试代码":

逻辑没代码或者乱代码-调试/修改逻辑->正确的逻辑,体现在代码匕出来正确的代码.

单纯的调试代码是:

正确的逻辑-编码出错的代码--调试->正确的代码

所以调试可以分为:

1.调试逻辑,2.调试代码,3.调试界面.4.etc..

错误的逻辑是不可能出来正确的程序.写程序首先得把逻辑(流程)弄清楚,然后才开始编码.

合并在一起就是:

含糊的逻辑-调试逻辑-,正确的逻辑--编码出错的代码-调试代码正确的代阿马

其中调试逻辑你可以利用"修改代码”来辅助免得脑子太累,但是脑子必须动,不能不思考

乱改来改去,而且不能跟"调试代码"混在一起.

改小错误常常混在一起就解决了,但是要养成分开的习惯,对于大错误才能一样轻松解

决.

别慌

很初学者一碰到错误就慌了,脑子里只知道"不行啊错了惨了找个人问问",要冷静下来

根据所学的知识去研究,到底什么是debug,如何debug,出错了到底该干什么

基本调试:

1.打开调试功能:php.ini里设置errojreporting=E_ALL以及display_errors=On重启

web服务(apache)

2.刷新错误的页面查看错误提示行号文件名

3.打开该文件定位到出错行.比如代码echo$abc[2];

4.理解错误:

a.查看手册理解错误含义要能理解首先要理解语言比如最简单的Undefinedindex2

意思是数组不存在该下标也就说明你访问了某个数组不存在的元素

b.如果已经知道如何改就直接修改,比如改成echo$abc[0];

c.不知道就显示变量内容在同样的地方加入var_dump($abc);刷新页面看看$abc这

个东西到底包含了什么元素

d.认为本该存在$abc[2]的,那就寻找错误源,往上回朔,或者用

var_dump(debug_backtrace());

必要的时候var_dump($_POST,$_GET,$_COOKIE,$_SERVER....)

本人未用过单步调试(stepbystep)如果使用调试器相对简单一点可以暂停下来看看变

量的内容到底是不是中应该出现的值,如果不是又是哪里产生这个值的

注意留意什么是环境

环境:

为什么全世界那么多人没事就你的有问题?你的问题爱上了你还是你爱上了你的问题?

其实"一方水土养一方人",你的"环境"养你的bug.

平时阅读书本/手册,注意记录整理什么是"环境

$_GET$_POST$_COOKIE$_SESSION$_SERVER这些是程序运行的至关重要因素

当然还包括你自己搞出来的$GLOBALS,都可以vajdump他们看看内容.

还有strtolower/strtoupper之类跟setlocale。函数有关,而默认值在linux下跟

getenv("LANG")getenv("LC_ALL")之类有关(putenv不一定起作用)

还有其他的比如php.ini的配置.

还有web服务器配置,比如apache支持某些函数而在别的服务器下就不支持

btw1:你的调试能力跟你的编码能力是相互相成的,根据你的编码经验你觉得还有什么该

注意的可以提出来

btw2:有些你或许觉得很简单很平常,但是想想你自己是不是真的做到了

----------------------以下内容比较罗嗦

对于你一眼就看出来的问题,当然可以立即解决,但是如果没头绪那就参考:

调试的大方向:

抓!

a.擒贼先擒王,最大的错误就是逻辑错误,先审查一边逻辑,然后才是代码关键的部位(跟

错误可能相关的)

b.顺瓜摸根..,有果必有因,知道最终错误的"结果",顺着摸过去就能发生错误的"原因",

比如

if($logined){

$a=100;

)

$_SESSION['a']=$a;提示Undefinedvariable$a,显然要找产生$a变量的地方,往上找

到if那块发现只有iftrue的时候才有$a于是改成

if($logined){

$a=100;

}else{

$a=0;

)

比如mysql的函数出错就有好多提示

提示密码错误:看看是参数的密码错了还是mysql服务器设置的密码错了

提示sql字段不存在,打开phpmyadmin去表里看看有哪些字段程序写错了还是忘记添加

了还是搞错表了

提示语句错误,找mysql手册而不是php手册

拆!

所谓万众一心那个什么什么来看,但是我们是•个人面对的一个"庞大"的代码,所以要来

个“反之亦然",把错误从代码里分开,把多个错误拆开.如此一来,对于你来说只不过是多

个小小的错误,一个个消灭.

忆:

回想以前是不是碰到类似的错误提示,那个时候是怎么解决的.如果没有回想到,那就应该

找新的方法.

对于初学者来说,反复锻炼很重要,回忆能加强学过的能力/方法,直到联会贯通,应用自如.

对比:

跟本文开头说的差不多,就是找正确的代码来对比.

有时候是没有相应的正确代码的,这个时候可以在脑子里重新构思一个正确代码来对比,

有点难呵呵,不过这样是避免又照着错误的思路去想

再就是看看手册,根据手册说明就知道其实应该如何不该如何.

00思路

要求你的程序比较00(不一定是对象,但是结构/思路上有。。)

00编程简单说就是对象化,每个类型的对■象完成某个功能,就像只老鼠只需要吃就能活,

一个对象/或者某部分代码只需要所期望的一些数据就能正常工作.

00debug法就是首先要有个观念:我的某个对象(or代码)只需要有一定的数据(环境下)就

可以正常工作

如果

1.有正常的数据也出错则说明是这个对象设计错了

2.传入的数据不正常,则说明使用这个对象的代码调用错了

高手或许觉得这条很"傻",其实对于初学者(包括以前的我)要形成这样的观念以及一直使

用这个观念来调试,却是要到了很久之后接近高手了才懂.

有点像‘拆'方法不过区别在于调试的时候:

1.取对象出来可以单独调试,因为好的对象(or代码)只需要尽量简单的数据,复杂的数

据可能在对象内部或者外部生存,而不会跨出/入对象(也就是不会传进来也不会传出去)

2.对于web要快速调试,并不一定要把对象的代码全部掏出来,只需要再调用对象的部分

添加T—些用来查看对象语句,比如var_dump($obj)var_dump($obj->myabc);

或者类似echo$http->download();这样的调用之前手工设置一些自己熟悉的数据比如:

$http->setUrl("http://localhost/abc.htmI");

直到确保这个对象工作正常了,就可以暂时撇开这个对象的代码了,看看别的东西有没有

错误

使用print语句、错误报告和PHPEclipse插件

级别:中级

TylerAnderson,自由作者

2006年1月23日

本文介绍调试PHP应用程序的各种方法,包括在ApacheandPHP中打开错误报告,以及通过在一个简耳

策略性的print语句,找到更困难的bug的源头。还会介绍用于Eclipse的PHPEclipse插件,这是一个,

实时语法解析能力,还会介绍PHPEclipse的DBG调试器扩展。

简介

有许多PHP调试技术可以在编码的时候节约大量时间。一个有效却很基本的调试技术就是打开错误报告。」

技术包括使用print语句,通过显示在屏幕上实际出现的内容,有助于精确地找出更难发现的bugcPHPEclip

件,能够强调常见的语法错误,可以与调试器结合起来用于设置断点。

设置

要学习本文描述的概念,需要PHP、Web服务器和Eclipse,调试器扩展支持的PHP版本是V5.0.3。

我们需要一个Web服务器来解析用PHP创建的页面并把它们显示到浏览器。本文中使用的是Apache2」

器都可以满足要求。

要利用本文中介绍的•些调试技术,需要安装EclipseV3.1.1和插件PHPEclipseV1.1.8o由于Eclipse要

以还要下载它。

还需要PHP的调试器扩展模块。安装它略有些麻烦。请仔细跟随安装调试器扩展的操作说明。现在,先在

那些要求装入和配置PHP扩展的行。在需要使用调试器的时候,再取消注释。

请参阅参考资料获得下载信息。现在介绍出错消息。

出错消息

出错消息是作为开发人员的第•道防线。谁都不想在一台没有配置成显示出错消息的服务器上用PHP开发彳

当代码调试完成,准备运行的时候,应当确保关闭了错误报告,因为不希望站点的访问者看到出错消息,因3

的信息来利用站点的弱点并黑掉站点。

也可以用出错消息为自己服务,因为它们会显示抛出或生成错误的正确代码行。这样,调试就变成在浏览器.

示的行号,并在代码中检查这一行。稍后,将会看到PHPEclipse插件通过即时地给语法错误加下划线并在保1

注语法错误,可在开发和调试过程中提供极大的帮助。

先来看如何在php.ini文件中开启错误报告并设置错误报告的级别。然后将学习如何在Apache的配置文件

PHP的错误报告

php.ini文件中有许多配置设置。您应当已经设置好自己的php.ini文件并把它放在合适的目录中,就像在L

Apache2的文档说明中所示的那样(请参阅参考资料)。在调试PHP应用程序时,应当知道两个配置变老

及其默认值:

display_errors=Offerror_reporting=E_ALL

通过在php.ini文件中搜索它们,可以发现这两个变量当前的默认值。display_errors变量的目的很明显

否显示错误。默认值是Off。但是,要让开发过程更加轻松,请把这个值设为On:

display_errors=On

error_reporting变量的默认值是E_ALL0这个设置会显示从不良编码实践到无害提示到出错的所有信息。

来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出。我只不

实践,但是不想看到无害的提示。所以,请用以下值代替error_reporting的默认值:

error_reporting=E_ALL&~E_NOTICE

重新启动Apache,就全部设置好了。接下来,将学习如何在Apache上做同样的事。

服务器上的错误报告

依赖于Apache正在做的工作,在PHP中打开错误报告可能没法工作,因为在计算机上可能有多个PHP

Apache正在使用哪个PHP版本,因为Apache只能查看一个php.ini文件。不知道Apache正在使用哪,

己是•个安全问题。但是,有•种方法可以在Apache中配置PHP变量,从而保证设置了正确的出错级别

而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占php.ini文件,从而提供更高级别的安全?

在配置Apache时,应该已经接触过<apache2-install-dir>/conf/httpd.conf中http.conf文件中的基本配置

要做在php.ini文件中已经做过的事,请把下列各行添加到httpd.conf,覆盖任何php.ini文件:

phpflagdisplayerrorsonphpvalueerror_reporting2039

这会覆盖在php.ini文件中为display.errors已经设置的标志,以及error_reporting的值。值2039

XNOTICEo如果愿意采用E_ALL,请把值设为2047。同样,还是要重启Apache。

接下来,要在服务器上测试错误报告。

测试错误报告

如果启动了错误报告,会节约许多时间。PHP中的错误会指向代码中的错误。请创建一个简单的PHP文件

所示一样定义它。

清单1.二个生成错误的简单PHP

<?phpprint(Z/Thenext1inegeneratesanerror.<br>z/);printaline("PLEASE?");printC

displayedduetotheaboveerror.");?>

第一个print。语句会向Web浏览器显示它的内容。但是第二个语句会生成错误并在Web页面上显示。

个print。语句不起作用,如图1所示。

图1.生成错误

现在开启了错误报告!接下来,用print语句帮助调试应用程序。

介绍print语句

因为应用程序中的功能性bug不会产生错误,所以在所有调试策略中,关于如何正确地放置和使用print或

应用程序的知识是一种很好的资产。可以用print语句在代码中缩小对问题语句的定位,这些语句在语法上咨

但是从代码的功能上看是bug。这些是最难发现和调试的bug,因为它们不会抛出错误。惟一知道的就是在t

是想要的内容,或者想要保存在数据库中的内容根本没有保存。

假设正在处理通过GET请求发送过来的表单数据,想向浏览器显示信息,但是出于某种原因,数据没有正确J

地从GET请求中读出。要调试这类问题,重要的是用print。或die()语句知道变量的值是什么。

die()语句会中止程序执行,并在Web浏览器上显示文本。如果不想注释掉代码,而且只想显示到出错之1

不想显示后面的信息,那么die。语句特别有用。

让我们在PHP中用print语句来测试这个概念

使用print语句进行调试

在我作程序员的那些时候,当我在Linux®上开发应用程序时,没有方便的GUI可以告诉我bug在哪,我]

放的print语句越多,我在应用程序中把bug的范围缩小到一行的机会越大。请创建另一个PHP文件test:

示的那样定义它。

产单2.显示通过GET提交的所有变量

<?php$j=print(Z/Letsretrieveallthevariablessubmittedtothis");printC

request:<br>/z);foreach(

PHP程序员的调试技术(fromibm)

使用print语句、错误报告和PHPEclipse插件

级别:中级

TylerAnderson,自由作者

2006年1月23日

本文介绍调试PHP应用程序的各种方法,包括在ApacheandPHP中打开错误报告,以及通过

脚本中放置策略性的print语句,找到更困难的bug的源头。还会介绍用于Eclipse的P

这是一个灵活的开发环境,具有实时语法解析能力,还会介绍PHPEclipse的DBG调试器扩

简介

有许多PHP调试技术可以在编码的时候节约大量时间。一个有效却很基本的调试技术就是打

个略微高级一点的技术包括使用print语句,通过显示在屏幕上实际出现的内容,有助于精

的bug。PHPEclipse是一个Eclipse插件,能够强调常见的语法错误,可以与调试器结合走

设置

要学习本文描述的概念,需要PHP、Web服务器和Eclipse。调试器扩展支持的PHP版本是

我们需要一个Web服务器来解析用PHP创建的页面并把它们显示到浏览器。本文中使用的表

任何Web服务器都可以满足要求。

要利用本文中介绍的一些调试技术,需要安装EclipseV3.1.1和插件PHPEclipseVI.1.80

求Java™技术,所以还要卜一载它。

还需要PIIP的调试器扩展模块。安装它略有些麻烦。请仔细跟随安装调试器扩展的操作说明短

文件中注释掉那些要求装入和配置PHP扩展的行。在需要使用调试器的时候,再取消注释。

请参阅参考资料获得下载信息。现在介绍出错消息。

出错消息

出错消息是作为开发人员的第一道防线。谁都不想在一台没有配置成显示出错消息的服务器上

但是,请记住,当代码调试完成,准备运行的时候,应当确保关闭了错误报告,因为不希望站

错消息,因为这会给他们提供足够的信息来利用站点的弱点并黑掉站点。

也可以用出错消息为自己服务,因为它们会显示抛出或生成错误的正确代码行。这样,调试就

看生成的错误所显示的行号,并在代码中检查这一行。稍后,将会看到PHPEclipse插件通过

加下划线并在保存文件时用红色“x”标注语法错误,可在开发和调试过程中提供极大的帮

先来看如何在Php.ini文件中开启错误报告并设置错误报告的级别。然后将学习如何在Apa

覆盖这些设置。

PHP的错误报告

php.ini文件中有许多配置设置。您应当已经设置好自己的php.ini文件并把它放在合适的

Linux上安装PHP和Apache2的文档说明中所示的那样(请参阅参考资料)。在调试PH

当知道两个配置变量。下面是这两个变量及其默认值:

display_errors=Offerror_reporting=E_ALL

通过在php.ini文件中搜索它们,可以发现这两个变量当前的默认值。display_errors变量白

它告诉PHP是否显示错误。默认值是Offo但是,要让开发过程更加轻松,请把这个值设为

display_errors=On

error_reporting变量的默认值是E_ALL0这个设置会显示从不良编码实践到无害提示到出有

E_ALL对于开发过程来说有点太细,的为它在屏幕上为一些小事(例如变量未初始化)也显示

嘉的输出。我只想看到错误和不良编码实践,但是不想看到无害的提示。所以,请用以下值f

errorreporting的默认值:

errorreporting=E_ALL&"ENOTICE

重新启动Apache,就全部设置好了。接卜一来,将学习如何在Apache上做同样的事。

服务器上的错误报告

依赖于Apache正在做的工作,在PHP中打开错误报告可能没法工作,因为在计算机上可能

有时很难区分Apache正在使用哪个PHP版本,因为Apache只能查看一个php.ini文件。

在使用哪个php.ini文件配置自己是一个安全问题。但是,有一种方法可以在Apache中配'

保证设置了正确的出错级别。

而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占php.ini文件,从而提供专

在配置Apache时,应该已经接触过<apache2-install-dir>/conf/httpd.conf中http.con

置。

要做在php.ini文件中已经做过的事,请把下列各行添加到httpd.conf,覆盖任何php.in

php_flagdisplay_errorsonphp_valueerror_reporting2039

这会覆盖在php.ini文件中为display_errors已经设置的标志,以及error_reporting白

表E_ALL&XNOTICEO如果愿意采用E_ALL,请把值设为2047。同样,还是要重启Apach

接下来,要在服务器上测试错误报告。

测试错误报告

如果启动了错误报告,会节约许多时间。PHP中的错误会指向代码中的错误。请创建一个简当

test,php,并像清单1所示一样定义它。

清单1.一个生成错误的简单PHP

<?phpprint(/zThenextlinegeneratesanerror.<br>/z);printaline("PLEASE?");prim

bedisplayedduetotheaboveerror.");?>

第一个print()语句会向Web浏览器显示它的内容。但是第二个语句会生成错误并在Web

成最后一个printO语句不起作用,如图1所示。

图1.生成错误

现在开启了错误报告!接下来,用print语句帮助调试应用程序。

介绍print语句

因为应用程序中的功能性bug不会产生错误,所以在所有调试策略中,关于如何正确地放置

或die语句来调试PHP应用程序的知识是一种很好的资产。可以用print语句在代码中缩

位,这些语句在语法上没有错误,也不是bug,但是从代码的功能上看是bugo这些是最难2

因为它们不会抛出错误。惟一知道的就是在浏览器上显示的内容不是想要的内容,或者想要保

容根本没有保存。

假设正在处理通过GET请求发送过来的表单数据,想向浏览器显示信息,但是出于某种原因

提交,或者不能正确地从GET请求中读出。要调试这类问题,重要的是用printO或die(

值是什么。

die()语句会中止程序执行,并在Web浏览器上显示文本。如果不想注释掉代码,而且只想

信息和出错信息,不想显示后面的信息,那么die()语句特别有用。

让我们在PIIP中用print语句来测试这个概念

使用print语句进行调试

在我作程序员的那些时候,当我在Linux®上开发应用程序时,没有方便的GUI可以告诉我

地发现我在程序中放的print语句越多,我在应用程序中把bug的范围缩小到一行的机会越

PHP文件test2.php,并像清单2所示的那样定义它。

清单2.显示通过GET提交的所有变量

—FCKpd__5

您可能会非常容易地发现清单2中的bug!您很棒!但请注意这是一个非常简单的脚本,只是彳

句进行调试而展示的一个例子而已。这个脚本只是提取GET请求中的所有变量,如果有,就

器上。还提供了一个表单,用GET请求向服务器发送变量以进行测试。请看输出,如图2月

图2.test2.php的输出

现在单击SendGETRequest按钮,请注意只有$GET请求的键显示在浏览器上,而正确的

在循环中放一个print语句,检验在foreach循环中每个元素中是否确实存在数据。请参长

清单互用print语句验证代码的功能

...foreach(

PHP程序员的调试技术(fromibm)

使用print语句、错误报告和PHPEclipse插件

级别:中级

TylerAnderson,自由作者

2006年1月23日

本文介绍调试PHP应用程序的各种方法,包括在ApacheandPHP中打开错误报告,以及1

PHP脚本中放置策略性的print语句,找到更困难的bug的源头。还会介绍用于Eclips

插件,这是一个灵活的开发环境,具有实时语法解析能力,还会介绍PHPEclipse的DBG

简介

有许多PHP调试技术可以在编码的时候节约大量时间。一个有效却很基本的调试技术就是:

一个略微高级一点的技术包括使用print语句,通过显示在屏幕上实际出现的内容,有助二

发现的bug。PHPEclipse是一个Eclipse插件,能够强调常见的语法错误,可以与调试落

置断点。

设置

要学习本文描述的概念,需要PHP、Web服务器和Eclipseo调试器扩展支持的PHP版本

我们需要一个Web服务器来解析用PHP创建的页面并把它们显示到浏览器。本文中使用白

是,任何Web服务器都可以满足要求。

要利用本文中介绍的一些调试技术,需要安装EclipseV3.1.1和插件PHPEclipseVI.1.80

求JavaN技术,所以还要下载它。

还需要PHP的调试器扩展模块。安装它略有些麻烦。请仔细跟随安装调试器扩展的操作说

php.ini文件中注释掉那些要求装入和配置PHP扩展的行。在需要使用调试器的时候,再

请参阅参考资料获得卜一载信息。现在介绍出错消息。

出错消息

出错消息是作为开发人员的第一道防线。谁都不想在一台没有配置成显示出错消息的服务器

码。但是,请记住,当代码调试完成,准备运行的时候,应当确保关闭了错误报告,因为7

者看到出错消息,因为这会给他们提供足够的信息来利用站点的弱点并黑掉站点。

也可以用出错消息为自己服务,因为它们会显示抛出或生成错误的正确代码行。这样,调力

上查看生成的错误所显示的行号,并在代码中检查这一行。稍后,将会看到PHPEclipse

语法错误加卜.划线并在保存文件时用红色“x”标注语法错误,可在开发和调试过程中提

先来看如何在php.ini文件中开启错误报告并设置错误报告的级别。然后将学习如何在AP

中覆盖这些设置。

PHP的错误报告

php.ini文件中有许多配置设置。您应当已经设置好自己的php.ini文件并把它放在合适I

Linux上安装PHP和Apache2的文档说明中所示的那样(请参阅参考资料•)。在调试

应当知道两个配置变量。下面是这两个变量及其默认值:

display_errors=Offerror_reporting=E_ALL

通过在php.ini文件中搜索它们,可以发现这两个变量当前的默认值。displayerrorsW

-它告诉PHP是否显示错误。默认值是Off-但是,要让开发过程更加轻松,请把这4

display_errors=On

errorreporting变量的默认值是EALL。这个设置会显示从不良编码实践到无害提示到H

EALL对于开发过程来说有点太细,由为它在屏幕上为一些小事(例如变量未初始化)也g

疝览器的输出。我只想看到错误和不良编码实践,但是不想看到无害的提示。所以,请用L

替error_reporting的默认值:

errorreporting=EALL&~ENOTICE

重新启动Apache,就全部设置好了。接下来,将学习如何在Apache上做同样的事。

服务器上的错误报告

依赖于Apache正在做的工作,在PHP中打开错误报告可能没法工作,因为在计算机上可

本。有时很难区分Apache正在使用哪个PHP版本,因为Apache只能查看一个php.ini

Apache正在使用哪个php.ini文件配置自己是一个安全问题。但是,有一种方法可以在Ap

变量,从而保证设置了正确的出错级别。

而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占php.ini文件,从而提£

性。

在配置Apache时,应该已经接触过<apache2-install-dir>/conf/httpd.conf中http.

本配置。

要做在php.ini文件中已经做过的事,请把下列各行添加到httpd.conf,覆盖任何php.

php_flagdisplay_errorsonphpvalueerrorreporting2039

这会覆盖在php.ini文件中为display_errors已经设置的标志,以及error_reporting

表E_ALL&~E_NOTICE。如果愿意采用E_ALL,请把值设为2047。同样,还是要重启Apa

接下来,要在服务器上测试错误报告。

测试错误报告

如果启动了错误报告,会节约许多时间。PHP中的错误会指向代码中的错误。请创建一个置

test.php,并像清单1所示一样定义它。

清单1.一个生成错误的简单PHP

<?phpprint(/zThenext1inegeneratesanerror.<br>");printaline("PLEASE?");pi

notbedisplayedduetotheaboveerror.");?>

第一个print()语句会向Web浏览器显示它的内容。但是第二个语句会生成错误并在Wei

造成最后一个print()语句不起作用,如图1所示。

图1.生成错误

现在开启了错误报告!接下来,用print语句帮助调试应用程序。

介绍print语句

因为应用程序中的功能性bug不会产生错误,所以在所有调试策略中,关于如何正确地放

print或die语句来调试PHP应用程序的知识是一种很好的资产。可以用print语句在彳

语句的定位,这些语句在语法上没有错误,也不是bug,但是从代码的功能上看是bugoi

调试的bug,因为它们不会抛出错误。惟一知道的就是在浏览器上显示的内容不是想要的P

存在数据库中的内容根本没有保存。

假设正在处理通过GET请求发送过来的表单数据,想向浏览器显示信息,但是出于某种原[

地提交,或者不能正确地从GET请求中读出。要调试这类问题,重要的是用print()或

量的值是什么。

die()语句会中止程序执行,并在Web浏览器上显示文本。如果不想注释掉代码,而且只4

的信息和出错信息,不想显示后面的信息,那么die()语句特别有用。

让我们在PHP中用print语句来测试这个概念

使用print语句进行调试

在我作程序员的那些时候,当我在Linux®上开发应用程序时,没有方便的GUI可以告诉

迅速地发现我在程序中放的print语句越多,我在应用程序中把bug的范围缩小到一行白

建另一个PHP文件test2.php,并像清单2所示的那样定义它。

清单2.显示通过GET提交的所有变量

<?php$j=print(Z/Letsretrieveallthevariablessubmittedtothis");pri

aGETrequest:<br>z/);foreach(

PHP程序员的调试技术(fromibm)

使用print语句、错误报告和PHPEclipse插件

级别:中级

TylerAnderson,自由作者

2006年1月23日

本文介绍调试PHP应用程序的各种方法,包括在ApacheandPHP中打开错误报告,以

单的PHP脚本中放置策略性的print语句,找到更困难的bug的源头。还会介绍用于

PHPEclipse插件,这是一个灵活的开发环境,具有实时语法解析能力,还会介绍PHPEc]

试器扩展。

简介

有许多PHP调试技术可以在编码的时候节约大量时间。一个有效却很基本的调试技术就,

另一个略微高级一点的技术包括使用print语句,通过显示在屏幕上实际出现的内容,

出更难发现的bugoPHPEclipse是一个Eclipse插件,能够强调常见的语法错误,可以

来用于设置断点。

设置

要学习本文描述的概念,需要PHP、Web服务器和Eclipse。调试器扩展支持的PHP版

我们需要一个Web服务器来解析用PHP创建的页面并把它们显示到浏览器。本文中使月

但是,任何Web服务器都可以满足要求。

要利用本文中介绍的一些调试技术,需要安装EclipseV3.1.1和插件PHPEclipseVI.1.

要求Java™技术,所以还要下载它。

还需要PHP的调试器扩展模块。安装它略有些麻烦。请仔细跟随安装调试器扩展的操作

在php.ini文件中注释掉那些要求装入和配置PHP扩展的行。在需要使用调试器的时。

请参阅参考资料获得下载信息。现在介绍出错消息。

出错消息

出错消息是作为开发人员的第一道防线。谁都不想在一台没有配置成显示出错消息的服乡

发代码。但是,请记住,当代码调试完成,准备运行的时候,应当确保关闭了错误报告,

的访问者看到出错消息,因为这会给他们提供足够的信息来利用站点的弱点并黑掉站点。

也可以用出错消息为自己服务,因为它们会显示抛出或生成错误的正确代码行。这样,调

器上查看生成的错误所显示的行号,并在代码中检查这一行。稍后,将会看到PHPEclipf

地给语法错误加下划线并在保存文件时用红色“x”标注语法错误,可在开发和调试过

帮助。

先来看如何在Php.ini文件中开启错误报告并设置错误报告的级别。然后将学习如何在

文件中覆盖这些设置。

PHP的错误报告

php.ini文件中有许多配置设置。您应当已经设置好自己的php.ini文件并把它放在合

像在Linux上安装PHP和Apache2的文档说明中所示的那样(请参阅参考资料)。彳

程序时,应当知道两个配置变量。下面是这两个变量及其默认值:

display_errors=Offerrorreporting=EALL

通过在php.ini文件中搜索它们,可以发现这两个变量当前的默认值。displayerrors

显——它告诉PHP是否显示错误。默认值是Off。但是,要让开发过程更加轻松,请把

display_errors=On

error_reporting变量的默认值是E_ALL0这个设置会显示从不良编码实践到无害提示至

息。EALL对于开发过程来说有点太.,因为它在屏幕上为一些小事(例如变量未初始4

会搞精浏览器的输出。我只想看到错误和不良编码实践,但是不想看到无害的提示。所以

替errorreporting的默认值:

error_reporting=EALL&~ENOTICE

重新启动Apache,就全部设置好了。接下来,将学习如何在Apache上做同样的事。

服务器上的错误报告

依赖于Apache正在做的工作,在PHP中打开错误报告可能没法工作,因为在计算机上

版本。有时很难区分Apache正在使用哪个PHP版本,因为Apache只能查看一个php.

道Apache正在使用哪个php.ini文件配置自己是一个安全问题。但是,有一种方法可

配置PHP变量,从而保证设置了正确的出错级别。

而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占php.ini文件,从而

安全性。

在配置Apache时,应该已经接触过<apache2-install-dir>/conf/httpd.conf中httf

基本配置。

要做在php.ini文件中已经做过的事,请把下列各行添加到httpd.conf,覆盖任何ph

phplagdisplay_errorsonphp_valueerrorreporting2039

这会覆盖在php.ini文件中为display_errors已经设置的标志,以及errorreporti

值2039代表E_ALL&~E_NOTICE。如果底意采用E_ALL,请把值设为2047。同徐,还是

接下来,要在服务器上测试错误报告。

测试错误报告

如果启动了错误报告,会节约许多时一间。PHP中的错误会指向代码中的错误。请创建一4

件test,php,并像清单1所示一样定义它。

清单1.一个生成错误的简单PHP

<?phpprint("Thenextlinegeneratesanerror.<br>");printaline("PLEASE?");pr

notbedisplayedduetotheaboveerror./z);?>

第一个print()语句会向Web浏览器显示它的内容。但是第二个语句会生成错误并在M

这造成最后一个print()语句不起作用,如图1所示。

图1.生成错误

现在开启了错误报告!接下来,用print语句帮助调试应用程序。

介绍print语句

因为应用程序中的功能性bug不会产生错误,所以在所有调试策略中,关于如何正确地

print或die语句来调试PHP应用程序的知识是一种很好的资产。可以用print语句

问题语句的定位,这些语句在语法上没有错误,也不是bug,但是从代码的功能上看是1

发现和调试的bug,因为它们不会抛出错误。惟•知道的就是在浏览器上显示的内容不是

者想要保存在数据库中的内容根本没有保存。

假设正在处理通过GET请求发送过来的表单数据,想向浏览器显示信息,但是出于某种

正确地提交,或者不能正确地从GET请求中读出。要调试这类问题,重要的是用print

句知道变量的值是什么。

die()语句会中止程序执行,并在Web浏览器上显示文本。如果不想注释掉代码,而且

之前的信息和出错信息,不想显示后面的信息,那么die()语句特别有用。

让我们在PHP中用print语句来测试这个概念

使用print语句进行调试

在我作程序员的那些时候,当我在Linux®上开发应用程序时,没有方便的GUI可以告

我迅速地发现我在程序中放的print语句越多,我在应用程序中把bug的范围缩小到一

请创建另一个PHP文件test2.php,并像清单2所示的那样定义它。

清单2.显示通过GET提交的所有变量

—FCKpd_5

您可能会非常容易地发现清单2中的bug!您很棒!但请注意这是一个非常简单的脚本

print语句进行调试而展示的一个例子而已。这个脚本只是提取GET请求中的所有变量

它们显示在浏览器上。还提供了一个表单,用GET请求向服务器发送变量以进行测试。浮

所示。

图2.test2.php的输出

除Mozilleu°M

LetsretrieveallthevariablessubmittedtothisscriptviaaGETrequest

Name:|Tyler

Emai|tyf❷randeisonS@yahoocom

SendGETRequest|

浜CDoneT>»F.

现在单击SendGETRequest按钮,请注意只有$GET请求的键显示在浏览器上,而正个

可以在循环中放一个print语句,检验在foreach循环中每个元素中是否确实存在数据

.单3用print语句验证代码的功能

—FCKpd_6

放进去的print语句是粗体。注意,现在已经知道在Web浏览器上显示的$key值是H

某些原因,值没有正确地显示。请看新的输出,如图3所示。

图3.修改后的test2.php的输出

现在已经知道应用程序正确地从GET请求接收到了变量,那么肯定是在代码中有bug。1

用来显示值的变量$j是错误的。在foreach语句中指定的是$i,所以它肯定会有正确

之中输入了$j」所以通过把$j替换成$i,迅速地修正了错误,重新载入页面之后,就

出,如图4所示。

图4.修正后的test2.php的输出

现在可以删除或注释掉刚才添加的print语句了,因为已经发现了代码中的bugo注意

应用程序时可能遇到的许多错误中的一个很小的子集。对于使用数据库时可能遇到的问罢

方案是输出SQL语句,以确保执行的SQL就是想要执行的。

现在要来看看如何使用EclipseIDE和PHPEclipse插件及调试器扩展进一步在调试历

使用PHPEclipse

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

用于Eclipse的PHPEclipse插件是用来开发PHP应用程序的一个流行工具。请启动

作区目录指定为Apache的www目录(在我的机器上是c:/www)。现在单击File>N

会弹出NewProject向导。双击PHP文件夹并选择PHPProjecto单击Next,输入项

debugArticle,并单击Finish。

如果把Web服务器设置为在端口80上侦听,那么不需要做任何修改。否则,请转到N

在PHP项目debugArticle上右击,选择Properties,然后单击PHPProjectSettingSc

WorkspaceSettings然后修改合适的localhost或者添加Web服务器侦听的端口(例

http://localhost:8080)。单击Apply完成设置。

Navigator窗口应当显示项目和一个.project文件。在项目上右击,就像前面做的那米

择New>PHPFile。用想要创建的PHP文件的名称test3.php替换*.php,然后单击Fir

IDE中应当出现一个新文件。可能需要导航到窗U底部的PHP浏览器来查看PHP文件出

图5)o

图5.Eclipse的PHPEclipse插件

注意,只有Windows®的用户可以像清单5所示的那样使用PHP浏览器。通过打开独立

浏览器指向测试脚本所在目录,也可以使用同样的功能。

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

在“使用调试器”一节中,将学习如何用Eclipse、PHPEclipse和前面下载的调试器

PHP应用程序。先从学习如何使用它的语法解析功能开始。

语法解析和加下划线

先从查看PHPEclipse如何提供帮助调试PHP应用程序的实时语法解析功能开始。要看

应用,先从在Eclipse中定义test3.php开始,如下所示。

<?phpprint(,/zHelloWorld!/z);?>

注意,在清单4中加下划线的两个字符在Eclipse中加了下划线,提示语法不正确。花

件,会在Eclipse中显示解析错误:在代码中与解析错误对应的行上会加上红“x”,

图6.语法错误强调

•PHPtl.phpEclipseSDK

print<>,HelloNorld',>t

WrtabkSmwtVvcrt1:6

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

从上面定义的test3.php中删除逗号(,)。按Ctrl+S保存文件,然后观察PHP浏览

显示了HeiloWorld(参见图7)。

图7.在PHPEclipse中预览PHP脚本

ePHPlrU3.phpEclipsSDK

«•6dtNr^atrSe•向外咏1田</ApetfwRsWndowf

•_X3%%%0-0-%-

o□

INtVi/3ocjIxMVdebu^Arbde/tMtJ.cihp

Hdk>World

Wr^bkSmrtInwrt217

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

使用调试器

使用调试器,可以设置断点并查看PHP代码到所设断点之前的浏览器输出。然后可以继

查看到下一断点之前的浏览器输出,然后再到下一个,直到PHP脚本完成。

现在把“设置”一节中在php.ini中注释掉的行取消注释,并重新启动Apacheo现Z

Eclipse能够和它挂上了。

现在在Eclipse中设计调试环境。请创建新的test4.php文件,先保持为空。现在单寻

在左侧面板中选择PHPDBGScript,并单击New。现在转到File选项卡,输入当前项目d

及想要调试的文件test4.php。现在转到Environment选项卡,然后再到Interpreter

的安装目录中找到php.exe文件(我的是c:/apps/php5.0.3/php.exe)»现在单击Rei

项卡,选择RemoteDebug,如果没有使用Windows,请取消“OpenwithDBGSessionI

browserbox”复选框。把RemoteSource路径设置成与要测试的PHP脚本的绝对路森

径)相同(我的设置是c:/www/debugArticle/test4.php)0现在单击Debugo

现在应当装入Debug透视图,如图8所示。否则,请单击Window>OpenPerspectivi

择Debugo

图8.Eclipse中的Debug透视图

现在可以设置断点了。

对于本文中使用的插件和扩展的版本,断点功能是必需的,因为PUP在把输出发送到浏

它。除此之外,需要做的不仅仅是设置一个断点把当前显示数据刷新到Web浏览器,所以

所示那样定义test4.phpo

闫单4.设置和创建断点

<?phpfunctionbreak-point(){ob_flush();flush();sleep(.1);debugBreak();}pr

getshownfirst,");print("aswillthis<br>");breakpoint();print("Thiswon't£

after");print(""continuingthebreak-point<br>z/);breakpoint();print("END!

breakpoint()函数会把缓冲的输出和其他缓冲的数据刷新到Web浏览器。对sleepC1

的,这样代码中止于debugBreakO之前,服务器才有足够的时间把数据刷新到Web浏

是前面下载的PHP调试器扩展的内部函数。这样,调用breakpoint0会把HTML块、

print0和echoO语句的数据刷新到浏览器,然后中止代码执行。

在像清单4那样编写完代码之后,可以打开浏览器并指向test4.php,或者可以查看PHF

的是http://localhost/debugArticle/test4.php)。每次输入和保存文件时,在PHP

已经启动了调试序列。如果不使用Windows,请通过浏览器查看test4.php。在保存了文平

单击Run>Resume继续代码执行。持续这么做,直到最后一行输出是END!为止(参见图

图9.初始的到第一个断点的PHP浏览器输出

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

图10.第一个断点之后到第二个断点之前的PHP浏览器输出

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

图门.完整的PHP浏览器输出

Debugtest4.phpEclipseSDK

HeEdtNaviteSearchProjectRtnWrdowHeb

»・Q•R♦、S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论