第4章 PHP程序调试

在PHP的编写过程中,错误是不可避免的,如何有效地调试并修复错误是一个程序员必备的一种能力。PHP 提供了很好的错误提示,并且通过与 Eclipse 工具结合可以很方便地进行程序调试。本章将对PHP中的错误类型和程序调试方法进行详细讲解。

4.1 PHP中的错误类型

在PHP中,常见的错误类型主要有以下5种。

➢ 语法错误:程序中错误地使用了PHP语法。

➢ 语义错误:程序中正确地使用了 PHP 语法,但是却没有任何意义。例如,错误地使用了函数参数等。

➢ 逻辑错误:程序中的逻辑没有达到预期的结果。

➢ 注释错误:程序中的注释与程序代码不符合。

➢ 运行时错误:由于服务器或资源不可用导致的代码失效。

其中,前4项是由程序员的失误造成的,第5项是因为一些客观因素造成的,与程序代码无关。

4.1.1 语法错误

几乎所有的语言都有自身的语法要求,错误地使用PHP语法将会导致错误。例如,以下代码就导致了一个语法错误。

        <?php
        $a = 1;
        $b = 2;
        $s = $a (+) $b;                                            //错误代码
        echo $s;
        ?>

上面代码中的第4行,错误地将加号用括号括了起来。虽然从代码可以看出要表示什么意思,但是PHP的编译器却认为这是错误的,并会输出下面的错误提示。

        Parse error: syntax error, unexpected ')' in C:\htdocs\TEST\test.php on line 4

这个错误就是由于错误地使用了表达式语法造成的。

4.1.2 语义错误

语义错误比语法错误的级别要低一些,是在语法正确的前提下导致的错误。例如,以下代码就导致了一个语义错误。

        <?php
        $a = "I ";
        $b = "love ";
        $c = "you";
        $s = $a + $b + $c;                                         //错误地使用了+进行字符串连接
        echo $s;
        ?>

PHP中的字符串连接符是“.”而不是“+”。上面的代码错误地使用了“+”作为字符串连接符。但是由于PHP能够隐式转换变量类型,因此上面的代码并不会导致编译器出错,只是无法得到预期的结果。

4.1.3 逻辑错误

逻辑错误对于PHP编译器来说并不算错误,是由于代码中的逻辑问题,导致运行没有得到期望的结果。例如,以下代码试图根据$score的值是否达到60来判断成绩是否及格。

        <?php
        if($score>60)                                         //判断$score是否超过60
            echo "及格";
        else
            echo "不及格";
        ?>

上面的代码对于PHP编译器来说没有任何问题。但是当$score的值为60时,程序会判断为不及格。这一点就没有符合要求,属于逻辑错误。

4.1.4 注释错误

对于一个大型系统或者很长的程序代码来说,程序中的注释与程序代码同样重要。有些时候,注释甚至比代码还重要。因为一个注释错误的代码对于后期维护来说可以说是一件很困难的事情。例如,以下代码中的注释就没有与程序代码的功能相符。

        <?php
        //对$i循环,从0到100
        for($i=0; $i<100; $i++)
        {
            echo $i;
        }
        ?>

上面代码中的注释应为“对$i循环,从0到99”。代码中的注释错误并不影响代码的运行,但是却会影响对代码的修改与维护。

4.1.5 运行时错误

运行时错误与代码无关,是由于环境或资源因素而导致的错误。例如,以下代码并没有任何错误。

        <?php
        $fp = fopen("data.dat","r");
        fclose($fp);
        ?>

但却在运行时输出了如下所示的错误信息。

        Warning: fopen(data.dat) [function.fopen]: failed to open stream: No such file or
    directory in
        C:\htdocs\TEST\test.php on line 2
        Warning: fclose(): supplied argument is not a valid stream resource in C:\htdocs\TEST\
    test.php on line 3

这两条警告信息是由于文件无法打开造成的,与代码无关。

4.2 PHP程序调试策略

在进行PHP程序的错误调试过程中,一个基本的调试技术就是打开错误报告;另一个就是使用print等屏幕输出语句,通过显示在屏幕上实际出现的内容来精确地找出更难发现的错误。

4.2.1 PHP的错误级别

在PHP的错误报告被打开以后,在浏览器中访问包含错误的PHP代码,就会输出相应的错误信息。在PHP中,错误级别主要分为4级。

1.分析错误

分析错误是在PHP编译器对PHP代码进行分析时产生的。PHP编译器运行代码的过程是首先将其编译成PHP可以识别的中间代码,然后再运行。分析代码在对代码进行分析时将判断代码中是否包含语法错误。如果检测到语法错误,则代码将不会被运行。例如,以下代码就包含了一个错误。

        <?php
        echo "row1";
        echo "row2";
        echo "row3;                                  //错误:row3右侧没有引号
        ?>

上述代码在被分析时就会输出如下所示的错误提示。

        Parse error: syntax error, unexpected $end in C:\htdocs\TEST\test.php on line 5

需要注意的是上面代码的错误提示并不是准确的,真正出错的是第4行,而不是第5行。PHP编译器对于代码的分析有时候并不能准确地判断错误所在。

解决这种错误通常需要仔细观察错误所在行上下文代码,从而找出错误并修正。

2.致命错误

致命错误往往是由于PHP编译器在运行PHP代码时遇到环境或资源不可用而导致的错误,如以下代码所示。

        <?php
        require("www.inc");
        ?>

程序需要包含一个名为www.inc的文件,但是由于www.inc文件已经被从服务器上删除,因而程序在运行时输出了如下所示的错误。

        Warning: require(www.inc) [function.require]: failed to open stream: No such file or
    directory in C:\htdocs\TEST\test.php on line 2
        Fatal error: require() [function.require]: Failed opening required 'www.inc'
    (include_path='.;C:\Program Files\xampp\php\pear\') in C:\htdocs\TEST\test.php on line 2

解决这种问题通常需要查看文件是否存在或者资源是否可用。

3.警告

警告信息是在代码运行时遇到的一些异常。例如,需要打开的文件无法找到等。警告信息并不影响PHP代码的运行。以下代码试图使用include语句来包含w3.inc文件。

        <?php
        include("w3.inc");
        echo "This is a test";
        ?>

当w3.inc文件在当前目录下无法找到时,PHP编译器会输出如下所示的警告信息。

        Warning: include(w3.inc) [function.include]: failed to open stream: No such file or
    directory in C:\htdocs\TEST\test.php on line 2
        Warning: include() [function.include]: Failed opening 'w3.inc' for inclusion
    (include_path='.;C:\Program Files\xampp\php\pear\') in C:\htdocs\TEST\test.php on line 2
        This is a test

从以上输出可以看到,虽然在浏览器中输出了警告信息,但是并没有影响代码的运行。

4.通知

通知一般用于提示相对比较小的错误,这些错误往往PHP编译器能够自行处理。例如,变量没有初始化等。以下代码试图输出一个未赋值的变量。

        <?php
        echo $s;
        ?>

显然,变量中不包含任何值。这种情况下,PHP编译器会将其设置为空值,并输出一条通知,如下所示。

        Warning: Uninitialized variable (s) in C:\htdocs\TEST\test.php on line 2

与警告信息一样,通知级别的错误也不会影响代码的整体运行。

4.2.2 打开PHP的错误报告

如前面介绍的php.ini文件,很多配置设置都是通过这个文件来实现的。在调试PHP应用程序时,有两个配置变量display_errors和error_reporting。下面是这两个变量在php.ini文件中的默认值。

        display_errors = Off
        error_reporting = E_ALL

其中,display_errors变量用来告诉PHP是否显示错误,error_reporting变量用来告诉PHP如何显示错误。display_errors的默认值为Off,也就是不开启错误报告。error_reporting的默认值是E_ALL,这个设置会显示所有需要提示的信息,其中包括错误、警告和一些正确的提示。一般情况下,用户只需要看到错误和警告就可以了,对于正确代码的提示往往会影响网页效果。

如果想开启PHP的错误报告,可以将这两个变量更改成以下值。

        display_errors = On
        error_reporting = E_ALL & ~E_NOTICE

重新启动Apache服务器,就全部设置好了。以下代码是一个简单的PHP例子,用来测试以上设置是否成功。

        <?php
        print("This is a test");                //这是一条简单的PHP语句
        priny("error here");                    //由于程序员的原因,将print打成了priny
        print("Test again");                    //这也是一条简单的PHP语句
        ?>

运行结果如下所示。

        This is a test
        Fatal error: Call to undefined function priny() in C:\htdocs\TEST\test.php on line 3

从上面的例子可以看到,由于第3行代码的错误,编译器输出了相应的错误信息,并且由于第3行的错误,第4行没有被继续执行。

4.2.3 使用print进行程序调试

上一节介绍了通过打开错误报告的方法来进行程序调试。当PHP的代码发生了错误或获得警告的时候,这个方法非常有效。但是某些时候,可能由于程序的原因,编译器没有输出任何错误,但是程序并没有输出期望的结果,如下例所示。

        <?php
        $a = 199;                                //这里程序员犯了一个错误,正确的代码应该是$a=100;
        $b = 200;
        $s = $a + $b;
        echo "100 + 200 = ".$s;
        ?>

如上例所示,由于程序员错误地将100写成了199,会导致运算结果的不正确。运行结果如下所示。

        100 + 200 = 399

编译器并没有报错,因为对199 和200 进行求和运算并不会导致任何错误。但是,399这个结果并不是用户期待的结果。这个程序很简单,所以只需要从头检查一下就可以发现这个错误。但是,如果程序非常复杂,就很难发现了。

这里,可以使用print将变量内容输出进行程序调试,以下代码在前面的例子中增加了调试代码。

        <?php
        $a = 199;
        print "[debug] a=".$a."<br>";                         //调试代码
        $b = 200;
        print "[debug] b=".$b."<br>";                         //调试代码
        $s = $a + $b;
        echo "100 + 200 = ".$s;
        ?>

运行结果如下所示。

        [debug] a=199
        [debug] b=200
        100 + 200 = 399

从代码运行结果可以看到,$a的值并不是期望的100,由此可以定位到错误发生的具体位置行,并修正错误。

4.3 使用PHPEclipse进行PHP程序调试

除了上面介绍的两种PHP程序调试方法以外,还可以使用外部工具进行PHP程序的调试。一些编辑工具如Eclipse,一些PHP调试器如PHP Debugger,以及一些网页制作软件如Adobe Dreamweaver等都可以实现PHP代码的调试。本节主要以Eclipse软件与PHPEclipse插件的结合使用,来介绍一下使用外部工具对PHP代码进行调试的一些方法。

4.3.1 使用Eclipse编写PHP程序的好处

用于Eclipse的PHPEclipse插件是用来开发PHP应用程序的一个流行工具。Eclipse有如下所述诸多优点。

➢ 免费:用户可以免费获取。

➢ 语言支持性好:Eclipse支持多种语言包,方便使用中文进行操作。

➢ 可扩展性好:支持许多功能强大的外挂。

➢ 平台跨越性好:支持多种操作系统,如Windows、Linux等。

➢ 安装方便:下载后只需要解压缩就可以直接运行。

4.3.2 PHPEclipse的安装与启动

Eclipse以及PHPEclipse的安装步骤如下所示:

(1)读者可以从http://www.eclipse.org/downloads/下载Eclipse的最新版本,并且,环境中需要Java 2 SDK支持。如果在要安装Eclipse的计算机上还没有Java SDK的支持,可以访问http://java.sun.com/j2se/下载最新的Java SDK支持。目前最新的Eclipse版本是3.5,但是由于最新的PHPEclipse版本并不提供对Eclipse 3.5的支持。因此,本书中介绍的Eclipse都以Eclipse 3.3为准。

(2)下载PHPEclipse插件。PHPEclipse插件可以从http://sourceforge.net/projects/phpeclipse/ 下载到最新版本。当前的PHPEclipse的最新版本是1.2.3,运行在相应的Eclipse 3.3.x版本上。下载文件的文件名类似于 PHPEclipse-x.x.x.yyyymmddhhmmPRD-bin.zip,其中 x.x.x 代表PHPEclipse的版本号,yyyymmddhhmm代表编译时间。当所有的文件都下载好后就可以安装了。

(3)对于没有安装Java SDK的读者,需要首先安装Java SDK。只需要直接运行下载的Java SDK安装文件即可。

(4)将Eclipse解压缩到一个指定的文件夹,例如,C:\eclipse。

(5)解压缩PHPEclipse的压缩包,将其中的features文件夹中的内容复制到Eclipse文件夹的features目录,将其中的plugins文件夹中的内容复制到Eclipse文件夹的plugins目录。

(6)通过直接运行eclipse文件夹中的eclipse.exe文件启动Eclipse。需要注意的是如果在计算机中曾经安装并且运行过Eclipse,在将PHPEclipse插件复制到Eclipse目录后,需要通过带参数的运行eclipse.exe –clear方可将插件加载。

(7)启动 Eclipse 以后,Eclipse 要求输入一个路径作为工作区(Workspace)。这里需要选择Apache的htdocs文件夹,也就是用于存放网页的目标文件夹。如果前面没有更改这项设置,则默认为C:\Program Files\Apache Software Foundation\Apache2.2\htdocs。选择好后,稍等片刻,Eclipse即被成功启动。

4.3.3 PHPEclipse的使用

本小节将以一个简单的PHP例子,详细说明如何使用PHPEclipse编写PHP代码。在编写代码前,需要首先对环境的属性和项目的属性进行一些设置,步骤如下所示。

(1)Eclipse启动以后,单击【File】|【New】|【Project】命令新建一个项目,在弹出的【New Project】向导对话框中选择PHP文件夹中的PHP Project项,然后单击【Next】按钮继续。在向导的下一页中输入项目名称,例如MyProject,然后单击【Finish】按钮完成。

(2)然后Eclipse的主界面就会呈现在读者的面前。此时可以看到在工具栏上有启动和关闭Apache服务器的按钮及启动MySQL的按钮,如图4-1所示。

图4-1 Eclipse中的Apache和MySQL启动按钮

(3)在初始状态时,这些按钮是无效的,需要通过单击【Window】|【Preferences】命令来设置。如图4-2所示,在【Preferences】窗口中,通过对左边菜单中的Apache和MySQL的设置来指定Apache和MySQL的安装路径,就可以使这些按钮生效。

图4-2 Eclipse的Preferences窗口

(4)项目的属性的设置可以通过单击【Project】|【Properties】命令来完成。在【Properties】窗口上单击【PHP Project Settings】选项,对项目文件的根目录和访问地址进行配置。如果在前面对Apache的设置中做过更改,则需要按照Apache的设置更改此处设置。

设置好以后就可以开始编写PHP程序了。

(1)单击【File】|【New】|【PHP File】命令,新建一个PHP页面文件,在Container处填写新文件所在位置,在filename处填写新文件的文件名,例如,hello.php。这时,在Eclipse的导航菜单中就会出现hello.php这个文件,在窗口底部的PHP Browser可以浏览到文件的当前输出,如图4-3所示。

图4-3 hello.php

(2)编辑hello.php文件来输入PHP代码。保存后,代码的运行结果就会在界面的下部显示出来,如图4-4所示。

图4-4 一个简单的PHP页面

4.3.4 PHPEclipse的语法错误强调功能

前面简要介绍了如何通过PHPEclipse编写PHP程序。在使用PHPEclipse进行代码编写的过程中,PHPEclipse可以随时随地提示代码中的错误。这是一个非常简便的发现错误的方法。

下面的例子是在编辑代码的时候,在echo语句后面错误地多写了一个逗号。PHPEclipse准确地发现了错误所在,并通过在代码下边画上红色波浪线来提示错误,与此同时还在所在行的左边显示一个红色的错号(×)来提示。单击保存后,可以看到PHP浏览器窗口的错误提示,如图4-5所示。

图4-5 PHPEclipse的错误语法提示功能

4.3.5 PHPEclipse的调试界面

PHPEclipse的另一个强大的功能是可以对PHP代码实现断点调试,即可以通过设置断点只运行一小部分PHP代码。这对于比较大的PHP代码的调试是非常有效的。

为了使PHPEclipse实现断点调试功能,需要首先安装DBG PHP程序调试器。具体安装步骤如下。

(1)DBG PHP程序调试器可以从DBG开发站点http://www.php-debugger.com/获取,也可以通过NuSphere的官方网站http://www.nusphere.com/获取新版本的试用版,目前的最新版本是3.8.10。

(2)将下载后的文件解压缩,根据 PHP 版本的不同选择相应的文件,并将其重命名成php_dbg.dll。

(3)将php_dbg.dll文件复制到PHP安装目录下的ext文件夹。

(4)编辑PHP文件夹下的php.ini文件,在其中填写如下代码。

        [debugger]
        extension=php_dbg.dll
        debugger.enabled=on
        debugger.profiler_enabled=on
        debugger.hosts_allow=localhost 127.0.0.1
        debugger.hosts_deny=ALL
        debugger.ports=7869, 10001, 10002, 10003, 10000/16

(5)重新启动Apache服务器完成安装。

为了测试DBG是否已经成功安装,可以通过运行phpinfo函数来查看,代码如下所示。

        <?php
        phpinfo();
        ?>

在浏览器中访问后,如果能看到如图4-6所示的段落,则说明安装成功。

图4-6 DBG安装确认

现在回到PHPEclipse的环境,按照以下步骤完成调试界面的配置。

(1)单击菜单上的【Run】|【Debug】命令,在【Debug】对话框中选择左侧菜单中的【PHP DBG Script】选项并双击。这时,可以看到一个新的选项New_configuration被创建出来,如图4-7所示。

图4-7 Debug对话框

在这里,可以重命名新的调试脚本的名称,并且可以在File选项卡上选择要调试的项目名称和文件名。这里将脚本名称命名为hello_dbg,并选取hello.php作为调试文件。

(2)单击【Environment】选项卡,在【Interpreter】选项卡中选取当前PHP安装目录下的php.exe文件,如图4-8所示。

图4-8 Environment选项卡

(3)单击【Remote Debug】选项卡,选中Remote Debug选项并在Remote Sourcepath处选择要调试文件所在的绝对路径,如图4-9所示。

图4-9 Remote Debug选项卡

(4)单击【Debug】按钮,完成配置。

(5)单击【Window】|【Other Perspective】|【Others】命令,然后选择Debug选项打开Debug透视图,如图4-10所示。

图4-10 打开透视图

(6)单击【OK】按钮,进入Eclipse的Debug界面,如图4-11所示。

图4-11 Debug界面

调试界面配置好以后,就可以使用Eclipse对以下PHP代码进行调试了。

        <?php
        function func($a=0, $b=0)                             //计算两个变量的和
        {
            return $a+$b;
        }
        $a = 1;
        $b = 2;
        $s = func($a, $b);                                    //获得两个变量的和
        echo $s;
        ?>

调试的步骤如下所示。

(1)在代码中要进行调试的地方设置断点。设置断点是通过双击程序清单中要设置断点的行左侧来实现的。双击后会看到代码左侧出现一个蓝色圆点,如图4-12所示。

图4-12 设置断点

(2)单击【Run】|【Debug】命令,开始调试。

(3)在【Debug】窗口可以看到进程在代码的第8 行,也就是设置断点的一行暂停了,如图4-13所示。

图4-13 Debug窗口

(4)在【Variables】窗口中可以看到当前断点处所有的变量信息,其中包括程序中的变量以及所有的预定义变量,如图4-14所示。

图4-14 Variables窗口

(5)根据【Variables】窗口中提供的变量的值,可以分析出当前的代码状态,并由此发现可能的错误。

至此,PHPEclipse的调试功能就全部介绍完了。PHPEclipse是一个很流行的PHP调试工具,读者可以通过实际操作细细体会其中的诸多强大功能。

4.3.6 使用PHPEclipse调试PHP代码的常见问题

在使用PHPEclipse进行程序调试时,往往会遇到一些问题。本节将介绍一些常见的问题及其解决办法。

1.通过Eclipse工具栏上的按钮无法启动Apache

这些按钮实际上是执行了一条Apache命令。如果出现了Eclipse工具栏上的按钮无法启动Apache的情况,可以首先去命令行查看是否可以正常启动Apache。如果Apache能够被正常启动,则需要单击【Window】|【Preferences】命令来查看当前Eclipse中的Apache命令设置,查看Apache安装路径是否与当前Apache的安装路径一致。

2.【PHP Browser】窗口没有在界面上显示出来

PHP Browser是一个内嵌在Eclipse中的PHP浏览器,在代码被修改后,能够很容易地查看到代码的运行效果。如果在界面上没有看到【PHP Browser】窗口,可以使用下面的方法重新打开它。

(1)单击【Window】|【Show View】|【Other】命令,弹出【Show View】窗口,如图4-15所示。

图4-15 Show View窗口

(2)打开【PHPeclipse Web Development】文件夹。

(3)选中【PHP Browser】选项,并单击【OK】按钮。

3.【Variables】窗口不能正确显示变量

在配置PHPEclipse的调试环境时常常遇到的一个问题,就是在一切都配置好以后【Variables】窗口在断点处无法显示出相应的变量名称。

这种问题通常都是由于Eclipse和PHPEclipse的版本不对应,或者PHP版本与DBG版本不对应造成的。解决这种问题的方法主要是要在下载时注意看版本的对应情况。例如,与PHPEclipse的1.2.3相对应的Eclipse版本是3.3.x。那么,将PHPEclipse插件加载到Eclipse 3.5上时,Eclispe将不能正确地分析出断点的变量名等调试信息。

在PHP中加载DBG模块时,一定要注意必须根据PHP的版本号选择相应的.dll文件。否则,调试模块将无法实现其相应的功能。

4.4 错误的处理

上一节介绍了使用PHPEclipse进行PHP程序调试的方法。使用PHPEclipse可以很方便地找出因为程序代码原因造成的错误。但是,对于一些环境错误将无法处理。

由于PHP的错误报告会输出一些包含服务器信息的提示,因此在实际应用环境中,由于一些环境原因导致的错误可能会给服务器或者Web系统带来安全隐患。因此,对于可能出现的错误的处理在实际应用环境上至关重要。

4.4.1 错误的隐藏

PHP提供了一个隐藏错误的方法。即在要被调用的函数名前加“@”符号来隐藏可能由于这个函数导致的错误信息。例如,以下代码在打开文件时如果出现了文件不存在或不可用等错误,PHP将会输出一条警告信息。

        <?php
        $fp = fopen("data.dat","r");                               //打开文件
        fclose($fp);                                               //关闭文件
        ?>

运行结果如下所示。

        Warning: fopen(data.dat) [function.fopen]: failed to open stream: No such file or
    directory in C:\PHP\test.php on line 2
        Warning: fclose(): supplied argument is not a valid stream resource in F:\PHP\test.php
    on line 3

从警告信息中可以看到系统所在的文件夹为C:\PHP\。

如果在函数前加上“@”则会隐藏这条信息。修改后的代码如下所示。

        <?php
        $fp = @fopen("data.dat","r");
        @fclose($fp);
        ?>

这样在浏览器上将什么都不输出。

4.4.2 错误信息的定制

很多时候,使用上面介绍的方法处理错误信息将会使访问者很迷惑。因为访问者无法知道当前页面的状态。所以很多时候,往往在隐藏系统错误信息的同时定制错误信息。

定制的方法通常是使用if语句来检测错误,并根据判断结果输出错误信息。以下代码就是一个判断文件是否成功打开的例子。

        <?php
        if($fp = @fopen("data.dat","r"))                          //判断函数是否执行成功
        {
            echo "Welcome";
        }
        else
        {
            echo "文件不存在或不可用";
            exit;
        }
        fclose($fp);
        ?>

需要注意的是上面例子中使用了exit语句。exit语句意味着退出当前脚本的执行,也就是exit语句之后的所有代码将不会被执行。在上面例子中使用exit语句可有效避免fclose语句因为$fp无效而输出的警告信息。

在开发实际系统时,往往为了页面的美观,在错误发生时将页面重定向到另一个专门用于显示错误的页面。

在PHP中,这种页面间的跳转通常使用header函数来实现。使用header函数进行页面跳转的语法格式如下所示。

        header("location: url")

其中,url表示要重定向的页面。

以下代码改写了上面的例子,将在文件不存在或者不可用时将浏览器的页面重定向到error.htm用于显示错误。

        <?php
        if($fp = @fopen("data.dat","r"))                      //如果能打开文件,则输出Welcome
        {
            echo "Welcome";
        }
        else                                                   //否则跳转到error.htm
        {
            header("Location: error.htm");
        }
        fclose($fp);
        ?>

error.htm的代码如下所示。

        <html>
        <head>
        <title>Error</title>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
        </head>

        <body>
            <h1><p align=center>出错啦!</p></h1>
          <table width="300" border="0" align="center" cellpadding="2" cellspacing="2">
            <tr>
              <td width="100"><div align="right">错误信息:</div></td>
              <td width="200">文件不存在或不可用</td>
            </tr>
          </table>
        </body>
        </html>

在浏览器上再次访问该页面,可以看到浏览器的输出如图4-16所示。

图4-16 错误页面

4.4.3 超时错误的处理

有的时候,由于脚本中的操作太多或者服务器连接过慢,可能会超过 Apache 服务器的最高限制。这个时候,就会出现下面的错误。

        Fatal error: Maximum execution time of 1200 second exceeded in F:\TEST\test.php on line 6

出现超时错误后,脚本中还没有被执行的代码将被忽略。因此,在一些可能会超时的脚本中要增加一些超时处理。

PHP 中的超时处理通常是通过使用 set_time_limit 函数延长脚本运行时间来实现的。set_time_limit函数的语法格式如下所示。

        void set_time_limit(int seconds)

其中,seconds表示要延长的秒数。

下面的例子是一个简单的循环,循环的次数是从浏览器上的地址栏参数获取的。如果循环的次数非常多,则需要延长脚本运行时间。

        <?php
        $times = (int)$_GET['times'];                    //从地址栏获取循环次数
        set_time_limit(1);                               //设置脚本运行时间为1秒
        for($i=0;$i<$times;$i++)
        {
            echo $i."<BR>";
            if($times%10000 == 0)                        //每循环10000次为脚本增加1秒可运行时间
            {
                  set_time_limit(1);
            }
        }
        ?>

4.5 小结

本章介绍了对PHP的代码进行调试的方法,其中包括使用代码直接调试和通过外部工具PHPEclipse进行调试。在编写一些小型脚本时,使用PHP中的print函数进行一些基本的调试是非常有效的。但是,对于一些大型项目或者比较长的代码,使用PHPEclipse能够得到更高的效率。除PHPEclipse外,目前还有几种流行的PHP程序调试工具,例如,PHP Development Tools(PDT)、Zend Studio Web Debugger和NuSphere PhpED等。这些工具与PHPEclipse的使用方法类似,为PHP的程序调试提供了很大的便利。