當前位置:
首頁 > 知識 > PHP 程序員的調試技術小結

PHP 程序員的調試技術小結

大家都知道在開發過程中,代碼的調試非常重要,對於一些常見錯誤的調試技巧有助於提高代碼編寫的效率。

本文介紹調試PHP應用程序的各種方法,包括在Apache and PHP中打開錯誤報告,以及通過在一個簡單的PHP腳本中放置策略性的print語句,找到更困難的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應用程序時,應當知道兩個配置變數。下面是這兩個變數及其默認值:

通過在php.ini文件中搜索它們,可以發現這兩個變數當前的默認值。

display_errors變數的目的很明顯——它告訴PHP是否顯示錯誤。

默認值是Off。但是,要讓開發過程更加輕鬆,請把這個值設為On:

error_reporting變數的默認值是E_ALL。這個設置會顯示從不良編碼實踐到無害提示到出錯的所有信息。

E_ALL對於開發過程來說有點太細,因為它在屏幕上為一些小事(例如變數未初始化)也顯示提示,會搞糟瀏覽器的輸出。

我只想看到錯誤和不良編碼實踐,但是不想看到無害的提示。所以,請用以下值代替error_reporting的默認值:

重新啟動Apache,就全部設置好了。接下來,將學習如何在Apache上做同樣的事。

伺服器上的錯誤報告

依賴於Apache正在做的工作,在PHP中打開錯誤報告可能沒法工作,因為在計算機上可能有多個PHP版本。有時很難區分Apache正在使用哪個PHP版本,因為Apache只能查看一個php.ini文件。

不知道Apache正在使用哪個php.ini文件配置自己是一個安全問題。但是,有一種方法可以在Apache中配置PHP變數,從而保證設置了正確的出錯級別。

而且,最好知道如何在伺服器端設置這些配置變數,以否決或搶佔php.ini文件,從而提供更高級別的安全性。

在配置Apache時,應該已經接觸過/conf/httpd.conf 中 http.conf 文件中的基本配置。

要做在php.ini文件中已經做過的事,請把下列各行添加到httpd.conf,覆蓋任何php.ini文件:

這會覆蓋在php.ini文件中為display_errors已經設置的標誌,以及error_reporting 的值。

值2039代表E_ALL & ~E_NOTICE。如果願意採用E_ALL,請把值設為2047。同樣,還是要重啟Apache。

接下來,要在伺服器上測試錯誤報告。

測試錯誤報告

如果啟動了錯誤報告,會節約許多時間。PHP中的錯誤會指向代碼中的錯誤。請創建一個簡單的PHP文件test.php,並像清單1所示一樣定義它。

清單1. 一個生成錯誤的簡單PHP

第一個print()語句會向Web瀏覽器顯示它的內容。但是第二個語句會生成錯誤並在Web頁面上顯示。

這造成最後一個print()語句不起作用,如圖1所示。

圖1. 生成錯誤

現在開啟了錯誤報告!接下來,用print語句幫助調試應用程序。

介紹print語句

因為應用程序中的功能性bug不會產生錯誤,所以在所有調試策略中,關於如何正確地放置和使用print或die語句來調試PHP應用程序的知識是一種很好的資產。

可以用print語句在代碼中縮小對問題語句的定位,這些語句在語法上沒有錯誤,也不是bug,但是從代碼的功能上看是bug。

這些是最難發現和調試的bug,因為它們不會拋出錯誤。惟一知道的就是在瀏覽器上顯示的內容不是想要的內容,或者想要保存在資料庫中的內容根本沒有保存。

假設正在處理通過GET請求發送過來的表單數據,想向瀏覽器顯示信息,但是出於某種原因,數據沒有正確地提交,或者不能正確地從GET請求中讀出。

要調試這類問題,重要的是用print()或die()語句知道變數的值是什麼。

die()語句會中止程序執行,並在Web瀏覽器上顯示文本。如果不想注釋掉代碼,而且只想顯示到出錯之前的信息和出錯信息,不想顯示後面的信息,那麼die()語句特別有用。

讓我們在PHP中用print語句來測試這個概念

使用print語句進行調試。

在我做程序員的那些時候,當我在Linux上開發應用程序時,沒有方便的GUI可以告訴我 bug在哪,我迅速地發現我在程序中放的print語句越多,我在應用程序中把bug的範圍縮小到一行的機會越大。

請創建另一個PHP文件test2.php,並像清單2所示的那樣定義它。

清單2. 顯示通過 GET 提交的所有變數

您可能會非常容易地發現清單2中的bug!您很棒!但請注意這是一個非常簡單的腳本,只是作為使用print語句進行調試而展示的一個例子而已。

這個腳本只是提取GET請求中的所有變數,如果有,就把它們顯示在瀏覽器上。還提供了一個表單,用GET請求向伺服器發送變數以進行測試。請看輸出,如圖2所示。

圖2. test2.php的輸出

現在單擊Send GET Request按鈕,請注意只有$_GET請求的鍵顯示在瀏覽器上,而正確的值都沒顯示。

可以在循環中放一個print語句,檢驗在foreach循環中每個元素中是否確實存在數據。請參閱清單3。

清單3. 用print語句驗證代碼的功能

放進去的print語句是粗體。

注意,現在已經知道在Web瀏覽器上顯示的$key值是正確的,但是由於某些原因,值沒有正確地顯示。請看新的輸出,如圖3所示。

圖3. 修改後的test2.php的輸出

現在已經知道應用程序正確地從GET請求接收到了變數,那麼肯定是在代碼中有bug。

查看之後注意到,用來顯示值的變數$j是錯誤的。在foreach語句中指定的是$i,所以它肯定會有正確的值,但是無意之中輸入了$j。所以通過把$j替換成$i,迅速地修正了錯誤,重新載入頁面之後,就看到了正確的輸出,如圖4所示。

圖4. 修正後的test2.php的輸出

現在可以刪除或注釋掉剛才添加的print語句了,因為已經發現了代碼中的bug。

注意,這只是在調試應用程序時可能遇到的許多錯誤中的一個很小的子集。對於使用資料庫時可能遇到的問題,一個好的解決方案是輸出SQL語句,以確保執行的SQL就是想要執行的。

現在要來看看如何使用Eclipse IDE和PHPEclipse插件及調試器擴展進一步在調試歷程中提供幫助。

使用PHPEclipse

您可能用過Eclipse,但是可能不熟悉它。請參閱參考資料獲得Eclipse平台的介紹。

用於Eclipse的PHPEclipse插件是用來開發PHP應用程序的一個流行工具。請啟動Eclipse並把工作區目錄指定為Apache的www目錄(在我的機器上是 c:www)。現在單擊File>New>Project。

會彈出New Project嚮導。雙擊PHP文件夾並選擇PHP Project。單擊Next,輸入項目名稱debugArticle,並單擊Finish。

如果把Web伺服器設置為在埠80上偵聽,那麼不需要做任何修改。否則,請轉到Navigator窗口,在PHP項目debugArticle上右擊,選擇Properties,然後單擊PHP Project Settings。

單擊Configure Workspace Settings然後修改合適的localhost或者添加Web伺服器偵聽的埠(例如http://localhost:8080)。單擊Apply完成設置。

Navigator窗口應當顯示項目和一個.project文件。在項目上右擊,就像前面做的那樣,只是這次選擇New>PHP File。

用想要創建的PHP文件的名稱test3.php替換*.php,然後單擊Finish。在Eclipse IDE中應當出現一個新文件。可能需要導航到窗口底部的PHP瀏覽器來查看PHP文件的當前輸出(參見圖5)。

圖5. Eclipse的PHPEclipse插件

注意,只有Windows的用戶可以像清單5所示的那樣使用PHP瀏覽器。通過打開獨立瀏覽器窗口並把瀏覽器指向測試腳本所在目錄,也可以使用同樣的功能。

現在來演示這個應用程序,證明它的強大能力。

在「使用調試器」一節中,將學習如何用Eclipse、PHPEclipse和前面下載的調試器PHP擴展來調試PHP應用程序。先從學習如何使用它的語法解析功能開始。

語法解析和加下劃線

先從查看PHPEclipse如何提供幫助調試PHP應用程序的實時語法解析功能開始。要看這個特性的實際應用,先從在Eclipse中定義test3.php開始,如下所示。

注意,在清單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文件,先保持為空。

現在單擊Run>Debug。在左側面板中選擇PHP DBG Script,並單擊New。現在轉到File選項卡,輸入當前項目debugArticle以及想要調試的文件test4.php。

現在轉到Environment選項卡,然後再到Interpreter子選項卡。在PHP的安裝目錄中找到php.exe文件(我的是c:appsphp5.0.3php.exe)。

現在單擊Remote Debug子選項卡,選擇Remote Debug,如果沒有使用Windows,請取消「Open with DBGSession URL in internal browser box」複選框。

把Remote Source路徑設置成與要測試的PHP腳本的絕對路徑(不是Web路徑)相同(我的設置是c:wwwdebugArticle est4.php)。現在單擊 Debug。

現在應當裝入Debug透視圖,如圖8所示。否則,請單擊Window>Open Perspective>Other,並選擇Debug。

圖8. Eclipse中的Debug透視圖

現在可以設置斷點了。

對於本文中使用的插件和擴展的版本,斷點功能是必需的,因為PHP在把輸出發送到瀏覽器之前會緩衝它。

除此之外,需要做的不僅僅是設置一個斷點把當前顯示數據刷新到Web瀏覽器,所以要像下面和圖8所示那樣定義test4.php。

清單4. 設置和創建斷點

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瀏覽器輸出

請注意圖9中的Debug窗口如何把執行顯示為掛起的。

圖10. 第一個斷點之後到第二個斷點之前的PHP瀏覽器輸出

圖10的Debug窗口仍然把執行顯示為掛起,而第二組數據顯示在PHP瀏覽器中。

圖11. 完整的PHP瀏覽器輸出

注意,圖11的Debug窗口中的代碼不再掛起,整個腳本已經執行,如圖11中的PHP瀏覽器所示。

既然已經看到了用PHPEclipse和調試器擴展進行開發的優勢,那麼很難想像沒有它會怎麼樣。

結束語

現在已經向PHP的調試技術集中添加了錯誤報告的運用、print語句、PHPEclipse和調試器擴展,您可以通過減少每行代碼的錯誤數量,成為更有效的 PHP 編碼人員。

請參閱參考資料獲得一些PHP教程,可以在上面測試這些新技能。

下載Sample code for PHP Debugging

參考資料

學習

您可以參閱本文在developerWorks全球站點上的 英文原文。

學習如何在基於Windows和UNIX的系統上安裝Java。

請訪問Eclipse.org獲得編程和如何使用它的全面信息。

「Eclipse平台入門」(developerWorks,2002年11月)提供了Eclipse的歷史和概述,包括如何安裝Eclipse和插件的細節。

請訪問PHPEclipse學習關於安裝PHPEclipse和如何使用它的更多內容。

DBG是一個全功能的PHP調試器引擎,一個交互的工具,有助於調試PHP腳本。請閱讀Installing and configuring the debugger上的這份教程。

要學習關於Eclipse的更多內容,請訪問developerWorks的Eclipse project resources。

要學習關於PHP的更多內容,請訪問developerWorks的PHP project resources。

請參閱PHP手冊獲得更多關於error reporting的內容。

請閱讀安裝PHP and Apache2 on Linux的操作說明。

請閱讀安裝PHP and Apache2 on Windows的操作說明。

要獲得一系列學習PHP編程的developerWorks教程,請參閱「學習PHP,第1部分」、學習PHP,第2部分 和學習PHP,第3部分。

請密切關注developerWorks technical events and webcasts。

請訪問developerWorks開放源碼專區獲得豐富的how-to信息、工具和項目更新,有助於用開放源碼技術進行開發並把它們用於 IBM 的產品。

獲得產品和技術

請從PHP.net下載最新版本的PHP。

請下載最新版本的Apache2。

請從Sun公司下載Java技術。

請從Eclipse.org下載最新版本的Eclipse。

請從Sourceforge下載PHPEclipse。把Eclipse解壓到eclipse-install-dir,然後把PHPEclipse解壓到eclipse-install-dir。

在安裝擴展時,要按照PHPEclipse instructions。但是,在要求在php.ini文件中裝入和配置PHP擴展的地方注釋掉那些行。在準備使用調試器時再取消這些行的注釋。

訂購免費的SEK for Linux,這套DVD(兩張),包含了來自DB2、Lotus、 Rational、Tivoli和WebSphere的用於Linux的最新IBM試用軟體。

請用IBM試用軟體 改造您的下一個開放源碼開發項目,可以下載也可以通過DVD 得到。

討論

通過參與developerWorks blogs加入developerWorks社區。

關於作者

Tyler Anderson2004年從Brigham Young大學畢業,獲得計算機科學學位。現在是他作為計算機工程碩士生的最後一學期。過去,他作為資料庫程序員為DPMG.com工作,現在他是位於Beaverton, Ore的Stexar公司的工程師。

原文地址:

http://www.ibm.com/developerworks/cn/opensource/os-debug/

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 優才學院 的精彩文章:

PHP框架之路由與控制器
李開復對話劉長銘直播取消通知
20個優秀主頁設計案例
JavaScript中Object的總結
高考以後,他們都去學編程了

TAG:優才學院 |

您可能感興趣

S7-PLCSIM模擬軟體在線程序調試
用GDB調試PHP及反序列化小記
WINDOWS系統開機慢的優化調試方法
Hawkeye逃避機制和反調試技術分析
製作iOS內核調試線與調試內核
調試4K投影機以及HDR視頻設備必學!ISF三級視頻認程課程簡單回顧
Python錯誤、調試和測試
FPS射擊型遊戲 基本實用調試
Chrome 調試技巧
UltraSoC嵌入式分析技術與Imperas虛擬平台聯手助力多核開發及調試
巧用Bertscope進行晶元/系統的接收端容限測試和調試分析
帶你梳理下ARM代碼編譯與鏈接調試的工作流程
Python 調試器入門
UltraSoC獲晶心科技選用於RISC-V開發的追蹤及調試
【網路研討會】介紹PVRStudio——首款支持在移動平台上進行GPU調試的IDE
是德科技推出首款 DDR5 和 LPDDR5 存儲器協議調試和驗證解決方案
冠軍Pony:我有特別的代碼調試技巧
IBM、哈佛聯合提出Seq2Seq-Vis:機器翻譯模型的可視化調試工具
優秀開發者必備技能包:Python調試器
專業音響工程設備調試方法技巧