PHP錯誤簡介
? ? ? ? PHP提供了錯誤處理和日志記錄的功能. 這些函數(shù)允許你定義自己的錯誤處理規(guī)則蜈抓,以及修改錯誤記錄的方式. 這樣启绰,你就可以根據(jù)自己的需要,來更改和加強錯誤輸出信息以滿足實際需要.
? ? ? ? 常見的錯誤類型有:語法錯誤沟使、環(huán)境錯誤委可、邏輯錯誤。平時遇到的warning腊嗡、notice都是錯誤着倾,只是級別不同而已。
? ? ? ? 常見的錯誤級別有:Deprecated(最低級別)燕少、Notice(通知)屈呕、Warning(警告)、Fatal(致命)棺亭、Parser(語法解析),E_USER_相關(guān)錯誤蟋软。 ? ? 查看PHP所有的錯誤級別:PHP錯誤預定義常量
? ? ? ? 在 PHP 中镶摘,默認的錯誤處理很簡單。一條錯誤消息會被發(fā)送到瀏覽器岳守,這條消息帶有文件名凄敢、行號以及描述錯誤的消息。
下面將詳細介紹幾個常用的錯誤處理函數(shù):
錯誤處理函數(shù)
1湿痢、error_reporting ?設(shè)置PHP的報錯級別
1)通過修改PHP配置文件中的error_reporting選項值
? ? 如涝缝,在php.ini設(shè)置如下:error_reporting = E_ALL
2)通過error_reporting()函數(shù)設(shè)置
? ? 如:
? ? error_reporting(0);? // 關(guān)閉所有PHP錯誤報告
? ? error_reporting(-1);? // 報告所有 PHP 錯誤
? ? error_reporting(E_ALL); //和error_reporting(-1)一樣
3)通過ini_set() 函數(shù)運行時設(shè)置
? ? ini_set('error_reporting',E_ALL);?
2、display_errors?設(shè)置是否將錯誤信息
該選項設(shè)置是否將錯誤信息作為輸出的一部分顯示到屏幕譬重,或者對用戶隱藏而不顯示拒逮。
1) ini_set('display_errors',1);
2)在php.ini設(shè)置如下:display_errors = On
說明:display_errors設(shè)置為On, 會將錯誤顯示到瀏覽器上臀规,不管是On還是Off都會記錄到你錯誤日志里面滩援,前提是配置了錯誤日志log_errors和error_log
3、set_error_handler ?設(shè)置一個用戶定義的錯誤處理函數(shù)
1)如:set_error_handler('my_error'); //my_error()為自定義的錯誤處理方法塔嬉。
2)如果把自定義的錯誤封裝到了一個類上玩徊,則使用數(shù)組的方式調(diào)用:
set_error_handler(array('MyErrorHander' , 'deal'));? //MyErrorHander為錯誤類租悄,deal為處理方法。
3)set_error_handler()參數(shù)介紹如下:
注:?
1) 以下級別的錯誤不能由用戶定義的函數(shù)來處理:?
?E_ERROR恩袱、E_PARSE泣棋、E_CORE_ERROR、E_CORE_WARNING畔塔、E_COMPILE_ERROR潭辈、E_COMPILE_WARNING,和在? 調(diào)用set_error_handler()函數(shù)所在文件中產(chǎn)生的大多數(shù)E_STRICT俩檬。
2)如果錯誤發(fā)生在腳本執(zhí)行之前(比如文件上傳時)萎胰,將不會? 調(diào)用自定義的錯誤處理程序因為它尚未在那時注冊。
4棚辽、trigger_error() ?產(chǎn)生一個用戶級別的 error/warning/notice 信息
bool?trigger_error?(string $error_msg [,int $error_type = E_USER_NOTICE] );
error_msg: 該 error 的特定錯誤信息技竟,長度限制在了1024個字符。超過1024長度的字符都會被截斷屈藐。
error_type: 該 error 所特定的錯誤類型榔组。僅 E_USER 系列常量對其有效,默認是E_USER_NOTICE联逻。
5搓扯、error_log —發(fā)送錯誤信息到某個地方
將錯誤記錄到指定日志中的方法:
1)在配制文件中:error_log = E:\phpStudy\MyError\test_error.txt
2)運行時設(shè)置:ini_set('error_log' , 'E:\phpStudy\MyError\test_error.txt');
3)使用error_log函數(shù):error_log("You messed up!",3,"./error/my-errors.log");
將錯誤記錄到系統(tǒng)日志當中:
運行時配置如:ini_set('error_log' , 'syslog'); 這個比較少用,具體查看方法這里不做多介紹包归,可以自行百度或google锨推。
將錯誤發(fā)送到指定郵箱:
如:error_log('當前系統(tǒng)被人攻擊啦,產(chǎn)生致命錯誤9馈;豢伞!' , 1 , '2737555@qq.com'); ?
當然厦幅,能成功發(fā)送的前提是得做好你的郵箱相關(guān)配制沾鳄。
6、error_get_last()? 獲取最后發(fā)生的錯誤
返回了一個關(guān)聯(lián)數(shù)組确憨,描述了最后錯誤的信息译荞,以該錯誤的 "type"、? ? "message"休弃、"file" 和 "line" 為數(shù)組的鍵吞歼。? 如果該錯誤由 PHP 內(nèi)置函數(shù)導致的,"message"會以該函數(shù)名開頭玫芦。? 如果還沒有錯誤則返回NULL浆熔。
注意:
1)使用@符號可以抑制錯誤輸出。
2)PHP配制文件中與錯誤相關(guān)選項
常用案例
例1、自定義錯誤處理函數(shù)
開始測試:
divide(0,1); ? 報錯如:My WARNING:[512] The denominator cannot be zero ! -- on line 30 in file E:\phpStudy\WWW\test\index.php
divide(3,0); ? 報錯如:My NOTICE:[1024] You numerator is zero, it just a notice . -- on line 34 in file E:\phpStudy\WWW\test\index.php ? 并繼續(xù)輸出計算結(jié)果:0
divide(3,'d'); ?報錯如:My ERROR:[256] denominator and numerator must be number ! ? ? ? Fatal error on line 27 in file E:\phpStudy\WWW\test\index.php, PHP 5.6.27 (WINNT) ? ? ?Aborting... ? 到這里就中斷會程序医增,下面還有程序也不會執(zhí)行慎皱。
divide(2); ? 在這里共報3個錯誤,如下:
divideee(3,'d'); ? 這里調(diào)用了PHP內(nèi)部的錯誤處理:Fatal error: Call to undefined function divideee() in?E:\phpStudy\WWW\test\index.php?on line?42 ??
說明——以下級別的錯誤不能由用戶定義的函數(shù)來處理: ? ? ?E_ERROR叶骨、E_PARSE茫多、E_CORE_ERROR、E_CORE_WARNING忽刽、E_COMPILE_ERROR天揖、E_COMPILE_WARNING,和在? 調(diào)用set_error_handler()函數(shù)所在文件中產(chǎn)生的大多數(shù)E_STRICT跪帝。
---------- ? < 例1 測試結(jié)束 > ? -------------
參考: