10.1.2 自定義PHP的錯誤報告處理方式
自定義錯誤報告的處理方式,可以完全繞過標準的PHP錯誤處理函數,這樣就可以按自己定義的格式打印錯誤報告,或改變錯誤報告打印的位置,以下幾種情況可以考慮自定義錯誤處理。
可以記下錯誤的信息,及時發現一些生產環境出現的問題
可以屏蔽錯誤。
可以控制錯誤的輸出。
可以作為調試工具。
使用set_error_handler()函數來設置用戶自定義錯誤處理。
<?php
/**
定義Error_Handler函數,
作為set_error_handler()的第一個參數"回調"
@param int $error_level 錯誤級別
@param string $error_message 錯誤信息
@param string $file 錯誤所在文件
@param int $lin 錯誤所在行數
*/
function error_handler($error_level,
$error_message, $file, $line) {
$EXIT = FALSE;
switch( $error_level ) {
//提醒級別
case E_NOTICE:
case E_USER_NOTICE :
$error_type = 'Notice'; break;
//警告級別
case E_WARNING:
case E_USER_WARNING:
$error_type = 'Warning'; break;
//錯誤級別
case E_ERROR:
case E_USER_ERROR:
$error_type = 'Fatal Error';
$EXIT = TRUE; break;
//其他末知錯誤
default:
$error_type = 'Unknown';
$EXIT = TRUE; break;
}
//直接打印錯誤信息,也可以寫文件或數據庫
printf ("<font color='#FF0000'><b>%s</b></font>: %s in <b>%s</b> on line <b>%d</b><br>\n", $error_type, $error_message, $file, $line);
//若出現錯誤則跳轉到友好錯誤提示頁面
if(TRUE === $EXIT) {
echo '<script>location="er.html" </script>';
}
}
error_reporting(0); //屏蔽程序中的錯誤
set_error_handler('error_handler'); //這個才是關鍵點,把錯誤的處理交給error_handler()
echo $novar; //使用末定義的變量要報 notice 的
echo 3/0; //除以0要報警告的
trigger_error('Trigger a fatal error', E_USER_ERROR); //自定義一個錯誤
?>
通過上面測試代碼可以很好解決安全和調試方面的矛盾,但注意
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不會被這個句柄處理的,也就是會用原始的方式顯示,不過通常情況下不會發生。
使用set_error_handler()后,error_reporting()將會失效。也就是所有錯誤都是由自定義的函數處理。
test.php
<?php
// error_reporting(E_ALL & ~E_NOTICE);
//在php中注冊一個函數, 來處理錯誤報告, 而不按原來的方式處理了
set_error_handler("myerrorfun");
$mess = "";
//自己的錯誤報告處理函數
function myerrorfun($error_type, $error_message, $error_file, $error_line) {
global $mess;
$mess.="發生錯誤級別為{$error_type}類型, 錯誤消息<b>{$error_message}</b>, 在文件<font color='red'>{$error_file}</font>中, 第{$error_line}行。<br>";
}
getType($a);
echo "1111111111111111<br>";
getType();
echo "222222222222222222222<br>";
// getType3();
echo "333333333333333333333<br>";
echo "---------------------------------------------------------<br>";
echo $mess;