国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP程序員的優(yōu)化調(diào)試技術(shù)和技巧

2024-09-04 11:50:09
字體:
供稿:網(wǎng)友
本文介紹調(diào)試 PHP 應(yīng)用程序的各種方法,包括在 Apache and PHP 中打開錯(cuò)誤報(bào)告,以及通過在一個(gè)簡單的 PHP 腳本中放置策略性的 print 語句,找到更困難的 bug 的源頭。還會(huì)介紹用于 Eclipse 的 PHPEclipse 插件,這是一個(gè)靈活的開發(fā)環(huán)境,具有實(shí)時(shí)語法解析能力,還會(huì)介紹 PHPEclipse 的 DBG 調(diào)試器擴(kuò)展。

  簡介

  有許多 PHP 調(diào)試技術(shù)可以在編碼的時(shí)候節(jié)約大量時(shí)間。一個(gè)有效卻很基本的調(diào)試技術(shù)就是打開錯(cuò)誤報(bào)告。另一個(gè)略微高級(jí)一點(diǎn)的技術(shù)包括使用 print 語句,通過顯示在屏幕上實(shí)際出現(xiàn)的內(nèi)容,有助于精確地找出更難發(fā)現(xiàn)的 bug。PHPEclipse 是一個(gè) Eclipse 插件,能夠強(qiáng)調(diào)常見的語法錯(cuò)誤,可以與調(diào)試器結(jié)合起來用于設(shè)置斷點(diǎn)。

  設(shè)置

  要學(xué)習(xí)本文描述的概念,需要 PHP、Web 服務(wù)器和 Eclipse。調(diào)試器擴(kuò)展支持的 PHP 版本是 V5.0.3。

  我們需要一個(gè) Web 服務(wù)器來解析用 PHP 創(chuàng)建的頁面并把它們顯示到瀏覽器。本文中使用的是 Apache2。但是,任何 Web 服務(wù)器都可以滿足要求。

  要利用本文中介紹的一些調(diào)試技術(shù),需要安裝 Eclipse V3.1.1 和插件 PHPEclipse V1.1.8。由于 Eclipse 要求 Java? 技術(shù),所以還要下載它。

  還需要 PHP 的調(diào)試器擴(kuò)展模塊。安裝它略有些麻煩。請(qǐng)仔細(xì)跟隨安裝調(diào)試器擴(kuò)展的操作說明。現(xiàn)在,先在 php.ini 文件中注釋掉那些要求裝入和配置 PHP 擴(kuò)展的行。在需要使用調(diào)試器的時(shí)候,再取消注釋。

  請(qǐng)參閱 參考資料 獲得下載信息。現(xiàn)在介紹出錯(cuò)消息。

  出錯(cuò)消息

  出錯(cuò)消息是作為開發(fā)人員的第一道防線。誰都不想在一臺(tái)沒有配置成顯示出錯(cuò)消息的服務(wù)器上用 PHP 開發(fā)代碼。但是,請(qǐng)記住,當(dāng)代碼調(diào)試完成,準(zhǔn)備運(yùn)行的時(shí)候,應(yīng)當(dāng)確保關(guān)閉了錯(cuò)誤報(bào)告,因?yàn)椴幌M军c(diǎn)的訪問者看到出錯(cuò)消息,因?yàn)檫@會(huì)給他們提供足夠的信息來利用站點(diǎn)的弱點(diǎn)并黑掉站點(diǎn)。

  也可以用出錯(cuò)消息為自己服務(wù),因?yàn)樗鼈儠?huì)顯示拋出或生成錯(cuò)誤的正確代碼行。這樣,調(diào)試就變成在瀏覽器上查看生成的錯(cuò)誤所顯示的行號(hào),并在代碼中檢查這一行。稍后,將會(huì)看到 PHPEclipse 插件通過即時(shí)地給語法錯(cuò)誤加下劃線并在保存文件時(shí)用紅色 “x” 標(biāo)注語法錯(cuò)誤,可在開發(fā)和調(diào)試過程中提供極大的幫助。

  先來看如何在 php.ini 文件中開啟錯(cuò)誤報(bào)告并設(shè)置錯(cuò)誤報(bào)告的級(jí)別。然后將學(xué)習(xí)如何在 Apache 的配置文件中覆蓋這些設(shè)置。

  PHP 的錯(cuò)誤報(bào)告

  php.ini 文件中有許多配置設(shè)置。您應(yīng)當(dāng)已經(jīng)設(shè)置好自己的 php.ini 文件并把它放在合適的目錄中,就像在 Linux 上安裝 PHP 和 Apache 2 的文檔說明中所示的那樣(請(qǐng)參閱 參考資料)。在調(diào)試 PHP 應(yīng)用程序時(shí),應(yīng)當(dāng)知道兩個(gè)配置變量。下面是這兩個(gè)變量及其默認(rèn)值:

 display_errors = Off error_reporting = E_ALL 

  通過在 php.ini 文件中搜索它們,可以發(fā)現(xiàn)這兩個(gè)變量當(dāng)前的默認(rèn)值。display_errors 變量的目的很明顯 ―― 它告訴 PHP 是否顯示錯(cuò)誤。默認(rèn)值是 Off。但是,要讓開發(fā)過程更加輕松,請(qǐng)把這個(gè)值設(shè)為 On:

 display_errors = On 

  error_reporting 變量的默認(rèn)值是 E_ALL。這個(gè)設(shè)置會(huì)顯示從不良編碼實(shí)踐到無害提示到出錯(cuò)的所有信息。E_ALL 對(duì)于開發(fā)過程來說有點(diǎn)太細(xì),因?yàn)樗谄聊簧蠟橐恍┬∈拢ɡ缱兞课闯跏蓟┮诧@示提示,會(huì)搞糟瀏覽器的輸出。我只想看到錯(cuò)誤和不良編碼實(shí)踐,但是不想看到無害的提示。所以,請(qǐng)用以下值代替 error_reporting 的默認(rèn)值:

 error_reporting = E_ALL & ~E_NOTICE 

  重新啟動(dòng) Apache,就全部設(shè)置好了。接下來,將學(xué)習(xí)如何在 Apache 上做同樣的事。

  服務(wù)器上的錯(cuò)誤報(bào)告

  依賴于 Apache 正在做的工作,在 PHP 中打開錯(cuò)誤報(bào)告可能沒法工作,因?yàn)樵谟?jì)算機(jī)上可能有多個(gè) PHP 版本。有時(shí)很難區(qū)分 Apache 正在使用哪個(gè) PHP 版本,因?yàn)?Apache 只能查看一個(gè) php.ini 文件。不知道 Apache 正在使用哪個(gè) php.ini 文件配置自己是一個(gè)安全問題。但是,有一種方法可以在 Apache 中配置 PHP 變量,從而保證設(shè)置了正確的出錯(cuò)級(jí)別。

  而且,最好知道如何在服務(wù)器端設(shè)置這些配置變量,以否決或搶占 php.ini 文件,從而提供更高級(jí)別的安全性。

  在配置 Apache 時(shí),應(yīng)該已經(jīng)接觸過 <apache2-install-dir>/conf/httpd.conf 中 http.conf 文件中的基本配置。

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

 php_flag  display_errors        on php_value error_reporting       2039 

  這會(huì)覆蓋在 php.ini 文件中為 display_errors 已經(jīng)設(shè)置的標(biāo)志,以及 error_reporting 的值。值 2039 代表 E_ALL & ~E_NOTICE。如果愿意采用 E_ALL,請(qǐng)把值設(shè)為 2047。同樣,還是要重啟 Apache。

  接下來,要在服務(wù)器上測(cè)試錯(cuò)誤報(bào)告。
  測(cè)試錯(cuò)誤報(bào)告

  如果啟動(dòng)了錯(cuò)誤報(bào)告,會(huì)節(jié)約許多時(shí)間。PHP 中的錯(cuò)誤會(huì)指向代碼中的錯(cuò)誤。請(qǐng)創(chuàng)建一個(gè)簡單的 PHP 文件 test.php,并像清單 1 所示一樣定義它。

清單 1. 一個(gè)生成錯(cuò)誤的簡單 PHP
 <?php print("The next line generates an error.<br>"); printaline("PLEASE?"); print("This will not be displayed due to the above error."); ?> 

  第一個(gè) print() 語句會(huì)向 Web 瀏覽器顯示它的內(nèi)容。但是第二個(gè)語句會(huì)生成錯(cuò)誤并在 Web 頁面上顯示。這造成最后一個(gè) print() 語句不起作用,如圖 1 所示。

圖 1. 生成錯(cuò)誤
按此在新窗口瀏覽圖片

  現(xiàn)在開啟了錯(cuò)誤報(bào)告!接下來,用 print 語句幫助調(diào)試應(yīng)用程序。

  介紹 print 語句

  因?yàn)閼?yīng)用程序中的功能性 bug 不會(huì)產(chǎn)生錯(cuò)誤,所以在所有調(diào)試策略中,關(guān)于如何正確地放置和使用 print 或 die 語句來調(diào)試 PHP 應(yīng)用程序的知識(shí)是一種很好的資產(chǎn)。可以用 print 語句在代碼中縮小對(duì)問題語句的定位,這些語句在語法上沒有錯(cuò)誤,也不是 bug,但是從代碼的功能上看是 bug。這些是最難發(fā)現(xiàn)和調(diào)試的 bug,因?yàn)樗鼈儾粫?huì)拋出錯(cuò)誤。惟一知道的就是在瀏覽器上顯示的內(nèi)容不是想要的內(nèi)容,或者想要保存在數(shù)據(jù)庫中的內(nèi)容根本沒有保存。

  假設(shè)正在處理通過 GET 請(qǐng)求發(fā)送過來的表單數(shù)據(jù),想向?yàn)g覽器顯示信息,但是出于某種原因,數(shù)據(jù)沒有正確地提交,或者不能正確地從 GET 請(qǐng)求中讀出。要調(diào)試這類問題,重要的是用 print() 或 die() 語句知道變量的值是什么。

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

  讓我們?cè)?PHP 中用 print 語句來測(cè)試這個(gè)概念

  使用 print 語句進(jìn)行調(diào)試

  在我作程序員的那些時(shí)候,當(dāng)我在 Linux? 上開發(fā)應(yīng)用程序時(shí),沒有方便的 GUI 可以告訴我 bug 在哪,我迅速地發(fā)現(xiàn)我在程序中放的 print 語句越多,我在應(yīng)用程序中把 bug 的范圍縮小到一行的機(jī)會(huì)越大。請(qǐng)創(chuàng)建另一個(gè) PHP 文件 test2.php,并像清單 2 所示的那樣定義它。

清單 2. 顯示通過 GET 提交的所有變量
 <?php  $j = "";  print("Lets retrieve all the variables submitted to this ");  print("script via a GET request:<br>");  foreach($_GET as $key => $i){      print("$key=$j<br>");  }  if($_GET['Submit'] == "Send GET Request")      $j = "done!<br>"; ?> <form method="GET">      Name: <input name="name"><br>      Email: <input name="email" size="25"><br>      <input name="Submit" type="submit" value="Send GET Request"> </form> 

  您可能會(huì)非常容易地發(fā)現(xiàn)清單 2 中的 bug!您很棒!但請(qǐng)注意這是一個(gè)非常簡單的腳本,只是作為使用 print 語句進(jìn)行調(diào)試而展示的一個(gè)例子而已。這個(gè)腳本只是提取 GET 請(qǐng)求中的所有變量,如果有,就把它們顯示在瀏覽器上。還提供了一個(gè)表單,用 GET 請(qǐng)求向服務(wù)器發(fā)送變量以進(jìn)行測(cè)試。請(qǐng)看輸出,如圖 2 所示。

圖 2. test2.php 的輸出
按此在新窗口瀏覽圖片

  現(xiàn)在單擊 Send GET Request 按鈕,請(qǐng)注意只有 $_GET 請(qǐng)求的鍵顯示在瀏覽器上,而正確的值都沒顯示。可以在循環(huán)中放一個(gè) print 語句,檢驗(yàn)在 foreach 循環(huán)中每個(gè)元素中是否確實(shí)存在數(shù)據(jù)。請(qǐng)參閱清單 3。

清單 3. 用 print 語句驗(yàn)證代碼的功能
 ...  foreach($_GET as $key => $i){      print("Correct data? " . $_GET[$key] . "<br>");      print("$key=$j<br>");  } ... 


  放進(jìn)去的 print 語句是粗體。注意,現(xiàn)在已經(jīng)知道在 Web 瀏覽器上顯示的 $key 值是正確的,但是由于某些原因,值沒有正確地顯示。請(qǐng)看新的輸出,如圖 3 所示。

圖 3. 修改后的 test2.php 的輸出
按此在新窗口瀏覽圖片

  現(xiàn)在已經(jīng)知道應(yīng)用程序正確地從 GET 請(qǐng)求接收到了變量,那么肯定是在代碼中有 bug。查看之后注意到,用來顯示值的變量 $j 是錯(cuò)誤的。在 foreach 語句中指定的是 $i,所以它肯定會(huì)有正確的值,但是無意之中輸入了 $j。所以通過把 $j 替換成 $i,迅速地修正了錯(cuò)誤,重新載入頁面之后,就看到了正確的輸出,如圖 4 所示。

圖 4. 修正后的 test2.php 的輸出
按此在新窗口瀏覽圖片

  現(xiàn)在可以刪除或注釋掉剛才添加的 print 語句了,因?yàn)橐呀?jīng)發(fā)現(xiàn)了代碼中的 bug。注意,這只是在調(diào)試應(yīng)用程序時(shí)可能遇到的許多錯(cuò)誤中的一個(gè)很小的子集。對(duì)于使用數(shù)據(jù)庫時(shí)可能遇到的問題,一個(gè)好的解決方案是輸出 SQL 語句,以確保執(zhí)行的 SQL 就是想要執(zhí)行的。

  現(xiàn)在要來看看如何使用 Eclipse IDE 和 PHPEclipse 插件及調(diào)試器擴(kuò)展進(jìn)一步在調(diào)試歷程中提供幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 茂名市| 龙州县| 砀山县| 繁峙县| 万年县| 桦甸市| 阳高县| 梁平县| 无棣县| 岚皋县| 阿拉善左旗| 辉县市| 霍城县| 古丈县| 潼南县| 中牟县| 通榆县| 读书| 综艺| 京山县| 吉首市| 德化县| 甘谷县| 招远市| 景宁| 米脂县| 棋牌| 鄂尔多斯市| 永修县| 靖远县| 绥棱县| 永登县| 深圳市| 平昌县| 三原县| 平乐县| 界首市| 合水县| 高雄县| 聊城市| 永胜县|