用PHP自定義錯誤處理器處理出錯信息_PHP教程
推薦:PHP網(wǎng)站開發(fā)過程的安全知識1、古老的欺騙SQL語句 在默認(rèn)模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php還是打開magic_quotes_gpc=on。 這樣所有從GET/POST/Cookie來的變量的單引號(')、雙引號()、反斜杠backslash(\)以及空字元NUL (the null byte)都會被加上反斜杠
用PHP自定義錯誤處理器處理出錯信息,如果您是PHP老手,當(dāng)然知道當(dāng)PHP腳本出錯時(shí)發(fā)生了什么事情。此時(shí)PHP解析器將在屏幕上給出錯誤信息,如 Fatal error: Call to undefined function on line 19 --,因此程序在此處終止。這個(gè)信息會嚇到客戶,他可能立即打電話和你進(jìn)行咨詢。
幸運(yùn)的是,這里有解決辦法。PHP擁有內(nèi)置工具,可以讓開發(fā)人員捕捉腳本錯誤然后將它們轉(zhuǎn)到自定義的錯誤處理器。此時(shí)則可以對處理器進(jìn)行編程顯示更多關(guān)于錯誤的詳細(xì)信息。還可以將錯誤寫入文件或數(shù)據(jù)庫以采取補(bǔ)救措施。有時(shí)候還可以對處理器編寫程序忽略錯誤消息。
本文中,我將闡述如何使用PHP的錯誤處理API構(gòu)建用戶自定義的錯誤處理器,并且說明如何以簡單而友好的方式顯示和管理腳本的錯誤信息。
錯誤類型和報(bào)告級別
我們從最基本的開始。PHP有三種最基本的錯誤類型,從低級到高級分別為:注意、警告和錯誤(或致命錯誤)。通常情況下,注意和警告不會終止程序;但是致命錯誤則是危險(xiǎn)故障(例如,調(diào)用一個(gè)沒有定義的函數(shù)或參考一個(gè)不存在的對象),將導(dǎo)致程序中斷。這些錯誤有可能在啟動、解析、編譯或運(yùn)行時(shí)發(fā)生。
關(guān)鍵字如E_NOTICE, E_ERROR等用于表明錯誤的不同類型和等級。在PHP手冊上可以獲得它們的詳細(xì)信息列表。
腳本階段錯誤顯示由error_reporting()函數(shù)進(jìn)行控制。這一函數(shù)針對不同的錯誤等級設(shè)置不同的參數(shù)。表A給出了使用此函數(shù)報(bào)告警告和致命錯誤的腳本程序。
表A
// display warnings and errors
error_reporting(E_WARNING | E_ERROR);
// this will generate a notice, which will never be displayed
echo $undefinedVar;
// this will generate a fatal error, which will be displayed
callUndefFunc();
?>
將表B中的代碼與上面的進(jìn)行比較發(fā)現(xiàn),Listing B中隱藏錯誤信息甚至隱藏致命信息,使得錯誤信息不會被顯示出來。
表B
// turn off error display
// no errors will be displayed
error_reporting(0);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?>
表C中的代碼將所有錯誤信息甚至簡單的注意事項(xiàng)都顯示出來:
表C
// all errors will be displayed
error_reporting(E_ALL);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?>
如以上3個(gè)例子所示,error_reporting()函數(shù)在控制錯誤發(fā)生時(shí),在屏幕上顯示內(nèi)容非常重要。這里的關(guān)鍵字是displayed,其表達(dá)的意思是錯誤不被顯示而不是錯誤沒有發(fā)生。因此,發(fā)生致命錯誤時(shí)(例如不正確的函數(shù)調(diào)用),程序?qū)⒈唤K止;但是,此時(shí)沒有任何消息顯示給用戶。
下面的例子(表 D)說明了這種情況:
表D
// no errors will be displayed
error_reporting(0);
// start a task
echo "Starting task...";
// call an undefined function
// a fatal error occurs during task processing
callMe();
// end the task
echo "Successfully completed task...";
?>
在表D中,在調(diào)用echo()函數(shù)時(shí)發(fā)生了致命錯誤,程序執(zhí)行時(shí)到這點(diǎn)被終止,但是卻沒有任何錯誤消息給出,用戶不知道這種情況還以為程序在正確運(yùn)行。下面的結(jié)論是非常明顯的:不給出錯誤報(bào)告非常危險(xiǎn),因?yàn)椴徽撨^程是否完成它常導(dǎo)致不正確的結(jié)論。
注意:調(diào)用不帶任何參數(shù)的error_reporting()將返回當(dāng)前的錯誤報(bào)告等級。
自定義錯誤處理器
很明顯,隱藏錯誤報(bào)告是不正確的,你肯定想知道有什么其他辦法加以改進(jìn)。自定義錯誤處理器就是一個(gè)很好的能取代PHP默認(rèn)錯誤處理系統(tǒng)的解決方法。自定義錯誤處理器可以以任何方式設(shè)置處理錯誤信息,包括信息如何顯示。
PHP函數(shù)中,完成這一功能的是set_error_handler()函數(shù)。錯誤發(fā)生時(shí),此函數(shù)被自動調(diào)用,然后給出4個(gè)參數(shù):錯誤代碼、錯誤消息、發(fā)生錯誤的腳本名稱和錯誤出現(xiàn)的行,此函數(shù)對錯誤管理負(fù)責(zé)。
表E給出一個(gè)簡單例子:
表E
// define custom handler
set_error_handler('myHandler');
// custom handler code
function myHandler($code, $msg, $file, $line) {
echo "Just so you know, something went wrong at line $line of your script $file. The system says that the error code was $code, and the reason for the error was: $msg. Sorry about this!";
}
// generate a notice
echo $undefVar;
?>
當(dāng)運(yùn)行此腳本的時(shí)候,會出現(xiàn)下面的信息:
Just so you know, something went wrong at line 11 of your /dev/error1.php. The system says that the error code was 8, and the reason for the error was: Undefined variable: undefVar. Sorry about this!
此時(shí),PHP的默認(rèn)錯誤處理器被用戶定義的myHandler()函數(shù)所取代,$undefVar變量被激活,PHP通知未定義變量的信息,此信息在運(yùn)行時(shí)引擎產(chǎn)生,然后傳遞給myHandler()函數(shù),同時(shí)錯誤發(fā)生的地址也傳遞給此函數(shù)。然后myHandler()函數(shù)輸出友好信息解釋錯誤。
注意:錯誤和致命錯誤很重要,它們會繞過自定義錯誤處理器,然后以PHP默認(rèn)的錯誤處理機(jī)制進(jìn)行顯示。顯示這些信息可使用前面討論的標(biāo)準(zhǔn)error_reporting()函數(shù)進(jìn)行控制。
例1:動態(tài)錯誤頁面和e-mail警報(bào)
表F給出了另一個(gè)范例,當(dāng)發(fā)生錯誤時(shí),將動態(tài)產(chǎn)生HTML錯誤頁面,并且通過e-mail向Web管理員進(jìn)行報(bào)告。
表F
// define custom handler
set_error_handler('myHandler');
// custom handler code
function myHandler($code, $msg, $file, $line, $context) {
// print error page
echo "";
echo "
Error!
";
echo "";
echo "An error occurred while processing your request. Please visit our home page and try again.";
echo "";
echo "";
// email error to admin
$body = "$msg at $file ($line), timed at " . date ("d-M-Y h:i:s", mktime());
$body .= "\n\n" . print_r($context, TRUE);
mail ("[email protected]", "Web site error", $body);
// halt execution of script
die();
}
// generate a notice
echo $undefVar;
?>
這里,自定義的錯誤處理器在遇到錯誤時(shí)動態(tài)產(chǎn)生HTML錯誤頁面。此錯誤信息也能被e-mail信息捕獲,然后通過PHP內(nèi)置的mail()函數(shù)發(fā)送給管理員。
這里出現(xiàn)了myHandler()函數(shù)的一個(gè)新參數(shù)$context。這是myHandler()函數(shù)的第五個(gè)參數(shù),是可選項(xiàng)。它包含了當(dāng)前變量狀態(tài)的快照。包括對管理員有用的上下文信息,有利于減少調(diào)試時(shí)間。
例2:自定義錯誤日志
表G給出了另一個(gè)例子,這個(gè)例子說明自定義錯誤處理器如何將詳細(xì)的錯誤信息輸入到文件。
表G
// define custom handler
set_error_handler('myHandler');
// custom handler code
function myHandler($code, $msg, $file, $line) {
// print error page
echo "";
echo "
Error!
";
echo "";
echo "An error occurred while processing your request. Please visit our home page and try again.";
echo "";
echo "";
// log error to file, with context
$logData = date("d-M-Y h:i:s", mktime()) . ", $code, $msg, $line, $file\n";
file_put_contents("web.log", $logData, FILE_APPEND);
// halt execution of script
die();
}
// generate a warning
echo is_float();
?>
與前面的例子相似,它也產(chǎn)生一個(gè)錯誤頁面并且將錯誤數(shù)據(jù)輸入到文件,以利于管理員進(jìn)行查看。數(shù)據(jù)以CSV格式進(jìn)行存儲,并且有簡單的數(shù)據(jù)分析和報(bào)告。請注意在本例和前面實(shí)例中,錯誤處理代碼結(jié)束時(shí)調(diào)用die()函數(shù),以確保腳本不再運(yùn)行。
如上面的范例所示,自定義錯誤處理器允許以友好的方式處理PHP腳本錯誤。并且可以發(fā)揮自己的創(chuàng)造性,不過需要記住的是:任何靈活性的增加都伴隨著開銷和時(shí)間的增加。
分享:學(xué)習(xí)動態(tài)網(wǎng)頁制作PHP技術(shù)的正則表達(dá)式正則表達(dá)式難于書寫、難于閱讀、難于維護(hù),經(jīng)常錯誤匹配意料不到的文本或者錯過了有效的文本,這些問題都是由正則表達(dá)式的表現(xiàn)和能力引起的。每個(gè)元字符(metacharacter)的能力和細(xì)微差別組合在一起,使得代碼不借助于智力技巧就無法解釋。 許多包含一定特性
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-用PHP自定義錯誤處理器處理出錯信息
。