第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的程序調試提供了很大的便利。
- 數據展現的藝術
- 基于LabWindows/CVI的虛擬儀器設計與應用
- 3D Printing with RepRap Cookbook
- MCSA Windows Server 2016 Certification Guide:Exam 70-741
- Security Automation with Ansible 2
- 數據庫原理與應用技術
- 基于單片機的嵌入式工程開發詳解
- 中國戰略性新興產業研究與發展·智能制造裝備
- AVR單片機工程師是怎樣煉成的
- 空間機器人智能感知技術
- ADuC系列ARM器件應用技術
- 互聯網單元測試及實踐
- 牛津通識讀本:大數據(中文版)
- Arduino創意機器人入門:基于ArduBlock(第2版)
- Microsoft 365 Mobility and Security:Exam Guide MS-101