PHP中error_reporting()函數(shù)的用法(修改PHP屏蔽錯(cuò)誤)
更新時(shí)間:2011年07月01日 13:15:11 作者:
一般在默認(rèn)的普通PHP文件中輸出一個(gè)未定義聲明的變量是不會(huì)報(bào)錯(cuò)誤的,但在codeigniter框架下卻要報(bào)錯(cuò)誤,這對(duì)于想集成 添加 和 修改 頁(yè)面于一體的”懶人”很不方便,由于是初學(xué)者開始還想怎么在代碼中屏蔽這一錯(cuò)誤提示呢.甚至用到了@,但聽很多人都說(shuō)@會(huì)大大降低性能.
今天學(xué)習(xí)CI框架過程中遇到個(gè)問題:
A PHP Error was encountered
Severity: Notice
Message: Undefined variable: user
一般在默認(rèn)的普通PHP文件中輸出一個(gè)未定義聲明的變量是不會(huì)報(bào)錯(cuò)誤的,但在codeigniter框架下卻要報(bào)錯(cuò)誤,這對(duì)于想集成 添加 和 修改 頁(yè)面于一體的”懶人”很不方便,由于是初學(xué)者開始還想怎么在代碼中屏蔽這一錯(cuò)誤提示呢.甚至用到了@,但聽很多人都說(shuō)@會(huì)大大降低性能….
最后突然想到,是不是codeigniter有意讓這錯(cuò)誤信息提示出來(lái)了呢,我們?cè)撊绾稳テ帘蔚暨@一類錯(cuò)誤呢?zé)o意中搜索到了”如何讓codeigniter不顯示Notice信息?”,茅塞頓開.原來(lái)是入口index.php中的error_reporting(E_ALL);在作怪.只需要把它改成
error_reporting(E_ALL ^ E_NOTICE);
就可以屏蔽掉這個(gè)錯(cuò)誤,而不影響其他的報(bào)錯(cuò).
下邊是搜索到的一些資料:
error_reporting() 設(shè)置 PHP 的報(bào)錯(cuò)級(jí)別并返回當(dāng)前級(jí)別。
語(yǔ)法
error_reporting(report_level)
如果參數(shù) level 未指定,當(dāng)前報(bào)錯(cuò)級(jí)別將被返回。下面幾項(xiàng)是 level 可能的值:
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
E_NOTICE 表示一般情形不記錄,只有程式有錯(cuò)誤情形時(shí)才用到,例如企圖存取一個(gè)不存在的變數(shù),或是呼叫 stat() 函式檢視不存在的檔案。
E_WARNING 通常都會(huì)顯示出來(lái),但不會(huì)中斷程式的執(zhí)行。這對(duì)除錯(cuò)很有效。例如:用有問題的常規(guī)表示法呼叫 ereg()。
E_ERROR 通常會(huì)顯示出來(lái),亦會(huì)中斷程式執(zhí)行。意即用這個(gè)遮罩無(wú)法追查到記憶體配置或其它的錯(cuò)誤。
E_PARSE 從語(yǔ)法中剖析錯(cuò)誤。
E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯(cuò)誤。
E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯(cuò)誤警告。
PHP 的錯(cuò)誤報(bào)告
php.ini 文件中有許多配置設(shè)置。您應(yīng)當(dāng)已經(jīng)設(shè)置好自己的 php.ini 文件并把它放在合適的目錄中,就像在 Linux 上安裝 PHP 和 Apache 2 的文檔說(shuō)明中所示的那樣。在調(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í)踐到無(wú)害提示到出錯(cuò)的所有信息。E_ALL 對(duì)于開發(fā)過程來(lái)說(shuō)有點(diǎn)太細(xì),因?yàn)樗谄聊簧蠟橐恍┬∈拢ɡ缱兞课闯跏蓟┮诧@示提示,會(huì)搞糟瀏覽器的輸出。我只想看到錯(cuò)誤和不良編碼實(shí)踐,但是不想看到無(wú)害的提示。所以,請(qǐng)用以下值代替 error_reporting 的默認(rèn)值:
error_reporting = E_ALL & ~E_NOTICE
重新啟動(dòng) Apache,就全部設(shè)置好了。接下來(lái),將學(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)接觸過 /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。
接下來(lái),要在服務(wù)器上測(cè)試錯(cuò)誤報(bào)告。
關(guān)于error_reporting()這個(gè)函數(shù),它是可以屏蔽到一些錯(cuò)誤信息,但是PHP 核心造成的錯(cuò)誤,是無(wú)法屏蔽的,因?yàn)镻HP 核心造成的錯(cuò)誤會(huì)直接導(dǎo)致PHP文件編譯失敗,因?yàn)闀鴮懜袷經(jīng)]有按照PHP的編碼規(guī)則寫而造成的錯(cuò)誤,是無(wú)法屏蔽的
* For now, avoid warnings of E_STRICT mode
* (this must be done before function definitions)
*/
if (defined('E_STRICT')) {
$old_error_reporting = error_reporting(0);
if ($old_error_reporting & E_STRICT) {
error_reporting($old_error_reporting ^ E_STRICT);
} else {
error_reporting($old_error_reporting);
}
unset($old_error_reporting);
常見的如下:
// Turn off all error reporting;關(guān)閉所有的錯(cuò)誤
error_reporting(0);
// Report simple running errors;報(bào)告一個(gè)簡(jiǎn)單的運(yùn)行錯(cuò)誤
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings …);包括報(bào)告一些未初始化的變量或捕捉變量名的拼寫錯(cuò)誤
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini;報(bào)告所有的錯(cuò)誤但不包括E_NOTICE 這也是php.ini的缺省設(shè)置
error_reporting(E_ALL ^ E_NOTICE);
// Report all PHP errors (bitwise 63 may be used in PHP 3);報(bào)告所有的錯(cuò)誤
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);同上
ini_set('error_reporting', E_ALL);
A PHP Error was encountered
Severity: Notice
Message: Undefined variable: user
一般在默認(rèn)的普通PHP文件中輸出一個(gè)未定義聲明的變量是不會(huì)報(bào)錯(cuò)誤的,但在codeigniter框架下卻要報(bào)錯(cuò)誤,這對(duì)于想集成 添加 和 修改 頁(yè)面于一體的”懶人”很不方便,由于是初學(xué)者開始還想怎么在代碼中屏蔽這一錯(cuò)誤提示呢.甚至用到了@,但聽很多人都說(shuō)@會(huì)大大降低性能….
最后突然想到,是不是codeigniter有意讓這錯(cuò)誤信息提示出來(lái)了呢,我們?cè)撊绾稳テ帘蔚暨@一類錯(cuò)誤呢?zé)o意中搜索到了”如何讓codeigniter不顯示Notice信息?”,茅塞頓開.原來(lái)是入口index.php中的error_reporting(E_ALL);在作怪.只需要把它改成
error_reporting(E_ALL ^ E_NOTICE);
就可以屏蔽掉這個(gè)錯(cuò)誤,而不影響其他的報(bào)錯(cuò).
下邊是搜索到的一些資料:
error_reporting() 設(shè)置 PHP 的報(bào)錯(cuò)級(jí)別并返回當(dāng)前級(jí)別。
語(yǔ)法
error_reporting(report_level)
如果參數(shù) level 未指定,當(dāng)前報(bào)錯(cuò)級(jí)別將被返回。下面幾項(xiàng)是 level 可能的值:
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
E_NOTICE 表示一般情形不記錄,只有程式有錯(cuò)誤情形時(shí)才用到,例如企圖存取一個(gè)不存在的變數(shù),或是呼叫 stat() 函式檢視不存在的檔案。
E_WARNING 通常都會(huì)顯示出來(lái),但不會(huì)中斷程式的執(zhí)行。這對(duì)除錯(cuò)很有效。例如:用有問題的常規(guī)表示法呼叫 ereg()。
E_ERROR 通常會(huì)顯示出來(lái),亦會(huì)中斷程式執(zhí)行。意即用這個(gè)遮罩無(wú)法追查到記憶體配置或其它的錯(cuò)誤。
E_PARSE 從語(yǔ)法中剖析錯(cuò)誤。
E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯(cuò)誤。
E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯(cuò)誤警告。
PHP 的錯(cuò)誤報(bào)告
php.ini 文件中有許多配置設(shè)置。您應(yīng)當(dāng)已經(jīng)設(shè)置好自己的 php.ini 文件并把它放在合適的目錄中,就像在 Linux 上安裝 PHP 和 Apache 2 的文檔說(shuō)明中所示的那樣。在調(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í)踐到無(wú)害提示到出錯(cuò)的所有信息。E_ALL 對(duì)于開發(fā)過程來(lái)說(shuō)有點(diǎn)太細(xì),因?yàn)樗谄聊簧蠟橐恍┬∈拢ɡ缱兞课闯跏蓟┮诧@示提示,會(huì)搞糟瀏覽器的輸出。我只想看到錯(cuò)誤和不良編碼實(shí)踐,但是不想看到無(wú)害的提示。所以,請(qǐng)用以下值代替 error_reporting 的默認(rèn)值:
error_reporting = E_ALL & ~E_NOTICE
重新啟動(dòng) Apache,就全部設(shè)置好了。接下來(lái),將學(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)接觸過 /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。
接下來(lái),要在服務(wù)器上測(cè)試錯(cuò)誤報(bào)告。
關(guān)于error_reporting()這個(gè)函數(shù),它是可以屏蔽到一些錯(cuò)誤信息,但是PHP 核心造成的錯(cuò)誤,是無(wú)法屏蔽的,因?yàn)镻HP 核心造成的錯(cuò)誤會(huì)直接導(dǎo)致PHP文件編譯失敗,因?yàn)闀鴮懜袷經(jīng)]有按照PHP的編碼規(guī)則寫而造成的錯(cuò)誤,是無(wú)法屏蔽的
復(fù)制代碼 代碼如下:
* For now, avoid warnings of E_STRICT mode
* (this must be done before function definitions)
*/
if (defined('E_STRICT')) {
$old_error_reporting = error_reporting(0);
if ($old_error_reporting & E_STRICT) {
error_reporting($old_error_reporting ^ E_STRICT);
} else {
error_reporting($old_error_reporting);
}
unset($old_error_reporting);
常見的如下:
復(fù)制代碼 代碼如下:
// Turn off all error reporting;關(guān)閉所有的錯(cuò)誤
error_reporting(0);
// Report simple running errors;報(bào)告一個(gè)簡(jiǎn)單的運(yùn)行錯(cuò)誤
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings …);包括報(bào)告一些未初始化的變量或捕捉變量名的拼寫錯(cuò)誤
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini;報(bào)告所有的錯(cuò)誤但不包括E_NOTICE 這也是php.ini的缺省設(shè)置
error_reporting(E_ALL ^ E_NOTICE);
// Report all PHP errors (bitwise 63 may be used in PHP 3);報(bào)告所有的錯(cuò)誤
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);同上
ini_set('error_reporting', E_ALL);
相關(guān)文章
php用數(shù)組返回?zé)o限分類的列表數(shù)據(jù)的代碼
php自定義函數(shù)之用數(shù)組返回?zé)o限分類的列表數(shù)據(jù),這樣的實(shí)現(xiàn)可以提高執(zhí)行的效率不要每次都從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)。2010-08-08詳解PHP的Yii框架的運(yùn)行機(jī)制及其路由功能
這篇文章主要介紹了PHP的Yii框架的運(yùn)行機(jī)制及其路由功能,Yii是一個(gè)基于組件的重量級(jí)的PHP框架,適合用來(lái)開發(fā)大型網(wǎng)站,需要的朋友可以參考下2016-03-03PHP 實(shí)現(xiàn)explort() 功能的詳解
本篇文章是對(duì)PHP 實(shí)現(xiàn)explort()功能進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP設(shè)計(jì)模式之簡(jiǎn)單投訴頁(yè)面實(shí)例
這篇文章主要為大家詳細(xì)介紹了PHP設(shè)計(jì)模式下簡(jiǎn)單投訴頁(yè)面實(shí)例,感興趣的小伙伴們可以參考一下2016-02-02javascript數(shù)組與php數(shù)組的地址傳遞及值傳遞用法實(shí)例
這篇文章主要介紹了javascript數(shù)組與php數(shù)組的地址傳遞及值傳遞用法,實(shí)例分析了javascript與php的數(shù)組使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01