最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

調(diào)試PHP程序的多種方法介紹

 更新時(shí)間:2014年11月06日 11:53:14   投稿:junjie  
這篇文章主要介紹了調(diào)試PHP程序的多種方法介紹,本文講解了PHP自帶的調(diào)試功能、引進(jìn)調(diào)試工具、調(diào)試業(yè)務(wù)邏輯錯(cuò)誤、調(diào)試非功能性的錯(cuò)誤等內(nèi)容,需要的朋友可以參考下

調(diào)試的定義:通過(guò)一定方法,在程序中找到并減少缺陷的數(shù)量,從而使其能正常工作。
這里說(shuō)一些如何調(diào)試PHP程序的經(jīng)驗(yàn)。

一、PHP自帶的調(diào)試功能

1、自帶的報(bào)錯(cuò)功能

兩個(gè)名詞:開(kāi)發(fā)環(huán)境是開(kāi)發(fā)人員在進(jìn)行開(kāi)發(fā)和調(diào)試的環(huán)境,生產(chǎn)環(huán)境是最終客戶(hù)在用的線上環(huán)境;
開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境要分開(kāi)設(shè)置報(bào)錯(cuò)功能。

(1)開(kāi)發(fā)環(huán)境

開(kāi)發(fā)環(huán)境需要打開(kāi)報(bào)錯(cuò),以下是php.ini的配置項(xiàng)及其說(shuō)明:

復(fù)制代碼 代碼如下:

; This directive sets the error reporting level.
; Development Value: E_ALL | E_STRICT (Show all errors, warnings and notices including coding standards.)
error_reporting = E_ALL | E_STRICT

; 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

這樣你在開(kāi)發(fā)過(guò)程中,能第一時(shí)間發(fā)現(xiàn)錯(cuò)誤。

即使是一個(gè)低等級(jí)的報(bào)錯(cuò)“Notice: Undefined variable: a in E:\phpspace\test.php on line 14”,但一個(gè)未定義的變量的使用往往暗藏著bug。

你會(huì)問(wèn),如果我引進(jìn)了開(kāi)源的類(lèi)庫(kù),他們拋出一堆的低等級(jí)錯(cuò)誤怎么辦?一般代碼質(zhì)量好的類(lèi)庫(kù),也沒(méi)有“Notice”級(jí)別的報(bào)錯(cuò)的。所以這也是鑒別一個(gè)類(lèi)庫(kù)質(zhì)量的方法。

(2)生產(chǎn)環(huán)境

生產(chǎn)環(huán)境不能直接將錯(cuò)誤輸出,而是記入日志,以下是php.ini的配置項(xiàng)及其說(shuō)明:

復(fù)制代碼 代碼如下:

; It could be very dangerous in production environments.
; It's recommended that errors be logged on production servers rather than
; having the errors sent to STDOUT.
display_errors = Off

; 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 = On

; Log errors to specified file.
error_log = /path/to/php_error.log

當(dāng)然日志寫(xiě)到文件里只是一個(gè)選擇,還有其他配置可參考手冊(cè)。

生產(chǎn)環(huán)境是給客戶(hù)提供服務(wù)的,你不可能在上面進(jìn)行斷點(diǎn)、打印輸出等操作,所以日志是不錯(cuò)的選擇。

2、其他一些語(yǔ)言特性、功能的使用

(1)少用錯(cuò)誤控制運(yùn)算符“@”

其的作用是,將“@”放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉。

如果一個(gè)缺陷發(fā)生在這個(gè)表達(dá)式中,從PHP的輸出中看不到任何錯(cuò)誤,這增加了調(diào)試的難度。所以能不用則不用。

(2)有些函數(shù)自帶有debug功能

比如這行代碼:

復(fù)制代碼 代碼如下:

$fp = fsockopen(“www.example.com”, 80, $errno, $errstr, 30);

開(kāi)發(fā)者調(diào)試時(shí)已經(jīng)確定,$fp為空,連接失敗,是這一行有問(wèn)題,但是為什么連接失?。?/p>

函數(shù)是php自帶的,無(wú)法進(jìn)行更深入的調(diào)試。所以一般這樣的函數(shù)(主要是網(wǎng)絡(luò)通信類(lèi)的),會(huì)自己提供調(diào)試參數(shù):$errno和$errstr。你可以加一句:

復(fù)制代碼 代碼如下:

if (!$fp) echo “$errstr ($errno)<br />\n”;

就能看到連接失敗的原因了。

這些函數(shù)有:fsockopen,pfsockopen,stream_socket_server,stream_socket_client 等。

還有些函數(shù)是調(diào)試一個(gè)功能用的,比如:mysql_errno,socket_last_error,socket_strerror 等。

這些只需要了解下,碰到能想到用即可。

二、引進(jìn)調(diào)試工具

在遇到復(fù)雜問(wèn)題時(shí),可以借助調(diào)試工具。比較成熟的有Xdebug、ZendDebugger。

以Xdebug為例,它能夠:控制打印輸出的樣式和數(shù)組層級(jí)、堆棧式的追蹤錯(cuò)誤、追蹤函數(shù)調(diào)用、代碼執(zhí)行覆蓋分析、程序的概要分析(Profiling)、遠(yuǎn)程調(diào)試。詳見(jiàn):http://xdebug.org/docs/。

Xdebug前兩個(gè)功能是對(duì)PHP原有的調(diào)試功能做了改進(jìn),更方便調(diào)試。

復(fù)雜的問(wèn)題,調(diào)試不出來(lái)的,可能是業(yè)務(wù)上的的問(wèn)題,下面也有說(shuō)業(yè)務(wù)邏輯的調(diào)試。

三、調(diào)試業(yè)務(wù)邏輯錯(cuò)誤

當(dāng)PHP腳本跑起來(lái),沒(méi)有任何錯(cuò)誤,只能說(shuō)它沒(méi)有語(yǔ)法上的錯(cuò)誤,但是不能說(shuō)明它業(yè)務(wù)邏輯上沒(méi)錯(cuò)誤。

很多業(yè)務(wù)邏輯的錯(cuò)誤并不會(huì)反映在語(yǔ)法錯(cuò)誤上,但調(diào)試的思路和PHP自帶調(diào)試功能差不多。

下面是一些方法。

1、最基本的調(diào)試方法

先確定兩個(gè)東西:程序預(yù)期的結(jié)果、程序現(xiàn)在的不符合預(yù)期的結(jié)果;
尋找與兩種結(jié)果相關(guān)的代碼片段;
閱讀這些代碼片段,嘗試以“肉眼”找出錯(cuò)誤;
找不出,則需要輸出一些關(guān)鍵變量,通過(guò)檢查它們的值是否正確來(lái)判斷是哪里發(fā)生了錯(cuò)誤;
若干次嘗試,最終你可以確定錯(cuò)誤發(fā)生在哪個(gè)點(diǎn)。

你也可以借助Xdebug等工具,查看變量值的變化,或者設(shè)置斷點(diǎn)進(jìn)行調(diào)試。

2、記錄運(yùn)行日志

有些復(fù)雜或特殊的業(yè)務(wù),用上面的方法不合適,比如:一個(gè)不能被打斷的后臺(tái)運(yùn)行腳本。這些情況下記錄運(yùn)行日志比較合適。

記日志的點(diǎn)要有所選擇,除了業(yè)務(wù)上比較重要的點(diǎn),通常容易出錯(cuò)的地方有:網(wǎng)絡(luò)連接和通信、系統(tǒng)權(quán)限問(wèn)題等。

3、單元測(cè)試

以代碼測(cè)試代碼,而不是像第一點(diǎn)一樣調(diào)試完會(huì)把測(cè)試代碼丟掉。以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。

這個(gè)話題比較大,但適合放這里提一下。有興趣的同學(xué)可以去了解。

四、調(diào)試非功能性的錯(cuò)誤

非功能性錯(cuò)誤,比如:內(nèi)存溢出導(dǎo)致程序掛掉了、效率有問(wèn)題導(dǎo)致程序非常慢、死循環(huán)了等等。

這些問(wèn)題,用“肉眼”檢查代碼效率太低了。

所以可以借助調(diào)試工具做程序的概要分析(Profiling),從中檢查出程序的瓶頸所在。

相關(guān)文章

  • 自己寫(xiě)的兼容低于PHP 5.5版本的array_column()函數(shù)

    自己寫(xiě)的兼容低于PHP 5.5版本的array_column()函數(shù)

    這篇文章主要介紹了自己寫(xiě)的兼容低于PHP 5.5版本的array_column()函數(shù),array_column是PHP 5.5新增函數(shù),有時(shí)在低版本中也可能要用到,需要的朋友可以參考下
    2014-10-10
  • php批量添加數(shù)據(jù)與批量更新數(shù)據(jù)的實(shí)現(xiàn)方法

    php批量添加數(shù)據(jù)與批量更新數(shù)據(jù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了php批量添加數(shù)據(jù)與批量更新數(shù)據(jù)的實(shí)現(xiàn)方法,涉及針對(duì)表單的處理與sql語(yǔ)句的靈活使用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • PHP實(shí)現(xiàn)簡(jiǎn)單日歷類(lèi)編寫(xiě)

    PHP實(shí)現(xiàn)簡(jiǎn)單日歷類(lèi)編寫(xiě)

    這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)簡(jiǎn)單日歷類(lèi)編寫(xiě),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • PHP 99乘法表的幾種實(shí)現(xiàn)代碼

    PHP 99乘法表的幾種實(shí)現(xiàn)代碼

    對(duì)于剛學(xué)PHP的新手來(lái)講,用php寫(xiě)九九乘法表無(wú)疑是非常經(jīng)典的一道練習(xí)題,但不要小看這道練習(xí)題,它對(duì)于邏輯的考驗(yàn)還是相當(dāng)?shù)轿坏?,這里腳本之家小編就為大家分享一下
    2020-10-10
  • php 輸出緩沖 Output Control用法實(shí)例詳解

    php 輸出緩沖 Output Control用法實(shí)例詳解

    這篇文章主要介紹了php 輸出緩沖 Output Control用法,結(jié)合實(shí)例形式詳細(xì)分析了php 輸出緩沖 Output Control基本概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • PHP mail()函數(shù)使用及配置方法

    PHP mail()函數(shù)使用及配置方法

    之前一直使用第三方的郵件系統(tǒng)發(fā)送郵件,比如QQ啊、gmail啊等,但是有時(shí)候客戶(hù)不希望給我們提供發(fā)件人郵箱和密碼,后來(lái)我才發(fā)現(xiàn)使用PHP自帶的mail函數(shù)完全可以實(shí)現(xiàn)這一需求了
    2014-01-01
  • php URL驗(yàn)證正則表達(dá)式

    php URL驗(yàn)證正則表達(dá)式

    php URL驗(yàn)證正則表達(dá)式,需要的朋友可以參考下。
    2011-07-07
  • PHP命名空間簡(jiǎn)單用法示例

    PHP命名空間簡(jiǎn)單用法示例

    這篇文章主要介紹了PHP命名空間簡(jiǎn)單用法,結(jié)合具體實(shí)例形式分析了php命名空間的簡(jiǎn)單定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • PHP實(shí)現(xiàn)在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法

    PHP實(shí)現(xiàn)在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法

    這篇文章主要介紹了PHP實(shí)現(xiàn)在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法,簡(jiǎn)單介紹了php public、private及protected的功能及用法,并結(jié)合實(shí)例形式分析了php在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法,需要的朋友可以參考下
    2017-11-11
  • php經(jīng)典趣味算法實(shí)例代碼

    php經(jīng)典趣味算法實(shí)例代碼

    許多人在學(xué)習(xí)C語(yǔ)言的時(shí)候都寫(xiě)過(guò)一些有趣的算法,其實(shí)這些算法在PHP中也同樣可以實(shí)現(xiàn),甚至有些算法的代碼比C語(yǔ)言中還要簡(jiǎn)潔,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

化隆| 沽源县| 高尔夫| 前郭尔| 中超| 太原市| 康马县| 宝鸡市| 北碚区| 砀山县| 丹寨县| 江都市| 陆河县| 菏泽市| 眉山市| 青铜峡市| 高陵县| 邛崃市| 塔城市| 夏津县| 修水县| 岳普湖县| 台州市| 嘉禾县| 长汀县| 渑池县| 延寿县| 武强县| 玉溪市| 彭泽县| 高密市| 龙泉市| 高雄市| 德令哈市| 正定县| 元谋县| 武平县| 八宿县| 宣恩县| 辽阳县| 方城县|