《PHP編程:調(diào)試PHP程序的多種方法介紹》要點:
本文介紹了PHP編程:調(diào)試PHP程序的多種方法介紹,希望對您有用。如果有疑問,可以聯(lián)系我們。
調(diào)試的定義:通過一定辦法,在程序中找到并減少缺陷的數(shù)量,從而使其能正常工作.
這里說一些如何調(diào)試PHP程序的經(jīng)驗.PHP編程
一、PHP自帶的調(diào)試功能PHP編程
1、自帶的報錯功能PHP編程
兩個名詞:開發(fā)環(huán)境是開發(fā)人員在進行開發(fā)和調(diào)試的環(huán)境,生產(chǎn)環(huán)境是最終客戶在用的線上環(huán)境;
開發(fā)環(huán)境和生產(chǎn)環(huán)境要分開設(shè)置報錯功能.PHP編程
(1)開發(fā)環(huán)境PHP編程
開發(fā)環(huán)境必要打開報錯,以下是php.ini的配置項及其說明:
PHP編程
; This directive controls whether or not and where PHP will output errors,
; notices and warnings too. Error output is very useful during development.
; Development Value: On
display_errors = On
PHP編程
這樣你在開發(fā)過程中,能第一時間發(fā)現(xiàn)差錯.PHP編程
即使是一個低等級的報錯“Notice: Undefined variable: a in E:\phpspace\test.php on line 14”,但一個未定義的變量的使用往往隱藏著bug.PHP編程
你會問,如果我引進了開源的類庫,他們拋出一堆的低等級錯誤怎么辦?一般代碼質(zhì)量好的類庫,也沒有“Notice”級別的報錯的.所以這也是鑒別一個類庫質(zhì)量的辦法.PHP編程
(2)生產(chǎn)環(huán)境PHP編程
生產(chǎn)環(huán)境不克不及直接將錯誤輸出,而是記入日志,以下是php.ini的配置項及其說明:
PHP編程
; Besides displaying errors, PHP can also log errors to locations such as a
; server-specific log, STDERR, or a location specified by the error_log
; directive found below. While errors should not be displayed on productions
; servers they should still be monitored and logging is a great way to do that.
; Production Value: On
log_errors = OnPHP編程
; Log errors to specified file.
error_log = /path/to/php_error.log
PHP編程
當(dāng)然日志寫到文件里只是一個選擇,還有其他配置可參考手冊.PHP編程
生產(chǎn)環(huán)境是給客戶提供服務(wù)的,你弗成能在上面進行斷點、打印輸出等操作,所以日志是不錯的選擇.PHP編程
2、其他一些語言特性、功能的使用PHP編程
(1)少用差錯控制運算符“@”PHP編程
其的作用是,將“@”放置在一個PHP表達式之前,該表達式可能產(chǎn)生的任何差錯信息都被忽略掉.PHP編程
如果一個缺陷發(fā)生在這個表達式中,從PHP的輸出中看不到任何錯誤,這增加了調(diào)試的難度.所以能不消則不消.PHP編程
(2)有些函數(shù)自帶有debug功能PHP編程
好比這行代碼:
PHP編程
開發(fā)者調(diào)試時已經(jīng)確定,$fp為空,連接失敗,是這一行有問題,但是為什么連接失敗?PHP編程
函數(shù)是php自帶的,無法進行更深入的調(diào)試.所以一般這樣的函數(shù)(主要是網(wǎng)絡(luò)通信類的),會本身提供調(diào)試參數(shù):$errno和$errstr.你可以加一句:
PHP編程
就能看到連接失敗的原因了.PHP編程
這些函數(shù)有:fsockopen,pfsockopen,stream_socket_server,stream_socket_client 等.PHP編程
還有些函數(shù)是調(diào)試一個功能用的,好比:mysql_errno,socket_last_error,socket_strerror 等.PHP編程
這些只必要了解下,碰到能想到用即可.PHP編程
二、引進調(diào)試工具PHP編程
在遇到復(fù)雜問題時,可以借助調(diào)試工具.比擬成熟的有Xdebug、ZendDebugger.PHP編程
以Xdebug為例,它能夠:控制打印輸出的樣式和數(shù)組層級、堆棧式的追蹤差錯、追蹤函數(shù)調(diào)用、代碼執(zhí)行覆蓋分析、程序的概要分析(Profiling)、遠程調(diào)試.詳見:http://xdebug.org/docs/.PHP編程
Xdebug前兩個功能是對PHP原有的調(diào)試功能做了改進,更便利調(diào)試.PHP編程
復(fù)雜的問題,調(diào)試不出來的,可能是業(yè)務(wù)上的的問題,下面也有說業(yè)務(wù)邏輯的調(diào)試.PHP編程
三、調(diào)試業(yè)務(wù)邏輯差錯PHP編程
當(dāng)PHP腳本跑起來,沒有任何錯誤,只能說它沒有語法上的錯誤,但是不克不及說明它業(yè)務(wù)邏輯上沒錯誤.PHP編程
很多業(yè)務(wù)邏輯的差錯并不會反映在語法差錯上,但調(diào)試的思路和PHP自帶調(diào)試功能差不多.PHP編程
下面是一些辦法.PHP編程
1、最基本的調(diào)試辦法PHP編程
先確定兩個東西:程序預(yù)期的結(jié)果、程序現(xiàn)在的不符合預(yù)期的結(jié)果;
尋找與兩種結(jié)果相關(guān)的代碼片段;
閱讀這些代碼片段,嘗試以“肉眼”找出錯誤;
找不出,則必要輸出一些關(guān)鍵變量,通過檢查它們的值是否正確來判斷是哪里發(fā)生了錯誤;
若干次嘗試,最終你可以確定錯誤發(fā)生在哪個點.PHP編程
你也可以借助Xdebug等工具,查看變量值的變化,或者設(shè)置斷點進行調(diào)試.PHP編程
2、記錄運行日志PHP編程
有些復(fù)雜或特殊的業(yè)務(wù),用上面的辦法不合適,比如:一個不能被打斷的后臺運行腳本.這些情況下記錄運行日志比較合適.PHP編程
記日志的點要有所選擇,除了業(yè)務(wù)上比擬重要的點,通常容易出錯的地方有:網(wǎng)絡(luò)連接和通信、系統(tǒng)權(quán)限問題等.PHP編程
3、單元測試PHP編程
以代碼測試代碼,而不是像第一點一樣調(diào)試完會把測試代碼丟掉.以測試驅(qū)動開發(fā).PHP編程
這個話題比擬大,但適合放這里提一下.有興趣的同學(xué)可以去了解.PHP編程
四、調(diào)試非功能性的差錯PHP編程
非功能性錯誤,好比:內(nèi)存溢出導(dǎo)致程序掛掉了、效率有問題導(dǎo)致程序非常慢、死循環(huán)了等等.PHP編程
這些問題,用“肉眼”檢查代碼效率太低了.PHP編程
所以可以借助調(diào)試工具做程序的概要闡發(fā)(Profiling),從中檢查出程序的瓶頸所在.PHP編程
《PHP編程:調(diào)試PHP程序的多種方法介紹》是否對您有啟發(fā),歡迎查看更多與《PHP編程:調(diào)試PHP程序的多種方法介紹》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/14209.html