php的set-error-handler用法總結
導語:爲了方便大家php語言的學習與使用,下面是小編給大家提供的php的set_error_handler用法總結,大家可以參考閱讀,更多詳情請關注應屆畢業生考試網。
set_error_handler() 函數設置用戶自定義的錯誤處理函數。該函數用於創建運行時期間的用戶自己的錯誤處理方法。該函數會返回舊的錯誤處理程序,若失敗,則返回 null。下面來看一些例子。
set_error_handler()
PHP從4.1.0開始提供了自定義錯誤處理句柄的功能函數set_error_handler(),但很少數腳本編寫者知道。set_error_handler這個函數可以很好地防止錯誤路徑泄露,當然還有其它更多的作用。
1.可以用來屏蔽錯誤。 出現錯誤一來會把一些信息暴漏給用戶,極有可能成爲黑客攻擊你網站的工具。 二來讓用戶覺得你的.水平很挫。
2.可以記下錯誤的信息, 及時發現一些生產環境的出現的問題。
3.可以做相應的處理, 出錯的時候可以顯示跳轉到預先定義好的出錯頁面,提供更好的用戶體驗。
4.可以作爲調試工具, 一些時候必須在生產環境調試一些東西, 但又不想影響正在使用的用戶。
5.。。。。
set_error_handler的使用方法如下:
view sourceprint?1 string set_error_handler ( callback error_handler [, int error_types])
我們利用error_reporting();看到的錯誤信息包括三個部分,錯誤信息,錯誤文件的絕對地址,錯誤出現的行數。其實還有一個是錯誤類型。Array ( [type] => 1 [message] => Call to undefined method SomeClass::somemedthod() [file] => /home/zhangy/www/aaaa/ [line] => 67 ),頁面的絕對路徑最好不要暴露給別人,不然給有些人可稱之機,爲了杜絕這一點,好多人都會採用,ini_set("display_errors",0);直接把錯誤信息給屏蔽掉了。這樣就不方便了,如果我們要看信息怎麼辦呢?每次查看的時候,是不是都要改一下代碼,或者是改一下apache的配置,在重起一下呢?
php有函數set_error_handler可以解決這個問題
用法如下:
mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )
php函數register_shutdown_function也可以解決這個問題
用法如下:
int register_shutdown_function ( string $func )
個人覺得報錯函數自己定義,至少有三點好處,
1,不會把文件的絕對路徑顯示出來,安全些
2,即使真的出現了錯誤信息,我們可以對錯誤信息進行處理,讓用戶也看不到fatal error這樣的東西。用戶體驗要好
3,項目上線後,有的時候,你還是要幫用戶去解決問題,這個時候難免要去修改代碼,但是我們又要讓錯誤信息報出來,又不能讓用戶看到,這個時候,用set_error_handler這樣的函數就很爽了。
個人做了一個小測試
<?php
error_reporting(0);
register_shutdown_function('error_alert');
function error_alert()
{
if(is_null($e = error_get_last()) === false)
{
set_error_handler('errorHandler');
if($e['type'] == 1){
trigger_error("fatal error", E_USER_ERROR);
}elseif($e['type'] == 8){
trigger_error("notice", E_USER_NOTICE);
}elseif($e['type'] == 2){
trigger_error("warning", E_USER_WARNING);
}else{
trigger_error("other", E_USER_OTHER);
}
}else{
echo "no error";
}
}
set_error_handler('errorHandler');
function errorHandler($errno, $errstr, $errfile, $errline,$errcontext)
{
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
break;
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />n";
echo " warning on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />n";
echo " notice on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />n";
echo " warning on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
break;
}
return true;
}
class SomeClass {
public function someMethod() {
}
}
SomeClass::someMedthod();
$a="asdf";
foreach($a as $d){
echo $d;
}
?>
現在我們就用自定義的錯誤處理把實際路徑過濾掉。假設有一個變量$admin,我們是用來判斷訪問者是否是管理員的(可以通過IP或者登錄的用戶id來做這個判斷)
//admin爲管理員的身份判定,true爲管理員。
//自定義的錯誤處理函數一定要有這4個輸入變量$errno,$errstr,$errfile,$errline,否則無效。
function my_error_handler($errno,$errstr,$errfile,$errline)
{
//如果不是管理員就過濾實際路徑
if(!admin)
{
$errfile=str_replace(getcwd(),"",$errfile);
$errstr=str_replace(getcwd(),"",$errstr);
}
switch($errno)
{
case E_ERROR:
echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) n";
echo "程序已經停止運行,請聯繫管理員。";
//遇到Error級錯誤時退出腳本
exit;
break;
case E_WARNING:
echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) n";
break;
default:
//不顯示Notice級的錯誤
break;
}
}
這樣就自定義了一個錯誤處理函數,那麼怎麼把錯誤的處理交給這個自定義函數呢?
// 應用到類
set_error_handler(array(&$this,"appError"));
//示例的做法
set_error_handler("my_error_handler");
so easy,這樣,就可以很好地解決安全和調試方便的矛盾了。而且你還可以花點心思,使錯誤提示更加美觀以配合網站的風格。
上面的例子中,我把錯誤信息關掉了,而用自己的函數處理錯誤,上面的這個頁面會報fatal error,報出來的錯誤信息我們是可以利用errorHandler來控制和處理。
好了,總結一下,下面是 set_error_handler 三種用法:
Php代碼
class CallbackClass {
function CallbackFunction() {
// refers to $this
}
function StaticFunction() {
// doesn’t refer to $this
}
}
function NonClassFunction($errno, $errstr, $errfile, $errline) {
}
// 三種方法如下:
1: set_error_handler(‘NonClassFunction’); // 直接轉到一個普通的函數 NonClassFunction
2: set_error_handler(array(‘CallbackClass’, ‘StaticFunction’)); // 轉到 CallbackClass 類下的靜方法 StaticFunction
3: $o =& new CallbackClass();
set_error_handler(array($o, ‘CallbackFunction’)); // 轉到類的構造函數,其實本質上跟下面的第四條一樣。
4. $o = new CallbackClass();
// The following may also prove useful:
class CallbackClass {
function CallbackClass() {
set_error_handler(array(&$this, ‘CallbackFunction’)); // the & is important
}
function CallbackFunction() {
// refers to $this
}
}
相關文章
-
php中set-error-handler的用法
家長會,以班主任老師的角度出發,如何組織一場家長會。你知道多少幼兒園家長會領導發言稿?下面本站小編爲你整理了幾篇幼兒園家長會領導發言稿,希望對你有幫助。幼兒園家長會領導發言稿一尊敬的各位家長:您們好!首先,我代表 -
A Letter to the Editor of a Newspaper英語四級作文
June 20th, 2004Dear Mr. / Miss Editor,I am a student from Tsinghua University and I am writing to you about my experience of buying a dictionary and my complaint about the service of a bookstore.It wa -
Jolie drops battle over perfume named Shilohy英語作文
自願退學申請書怎麼寫2022 篇1敬愛的院領導:你們好!我感謝學院給我這樣一個低分考生讀大學的機會,承蒙這1年來學院的培養和教導。在輕鬆愉快的學習氛圍下,我萌發了退學的想法,考慮再三,現正要將此想法付誅行動。後經過輔導 -
The relationship between theory and practice大學英語作文
We all know that books are a source of there are those who think what the book contains must be is stupid to follow the books without any the old saying goes,to believe everything in books is worse -
雙語閱讀:The Props to Help Man Endure
The Props to Help Man EndureUntil he does so, he labors under a curse. He writes not of love but of lust, of defeats in which nobody loses anything of value, of victories without hope and, worst of al -
《The Prevalence of Western Holidays》英語四級作文
Many young people in China today prefer Weste holidays to traditional Chinese festivals. Christmas is now celebrated by the younger generation all over China, and it has become especially popular as a -
Efforts Urged to Improve Womens Reproductive Health英語閱讀
Efforts Urged to Improve Women's Reproductive HealthParliamentarians from over 100 countries are being urged to take action in improving women's reproductive health ahead of the 2015 deadline -
Thinkpad筆記本開機顯示Tointerrruptnormalstartup解決方法
Thinkpad筆記本開機顯示To interrrupt normal startup的解決方法1、先等待5-6分鐘,如果系統又恢復了正常,說明可能是系統硬盤或者風扇區出了問題;2、假如過了5-6分鐘依然沒有反應,則可嘗試先拆掉筆記本電池在裝上;3、或 -
A Letter to the University President爲題目的作文
Direction: For this part, you are allowed thirty minutes to write a composition on the topic: A letter to the university president about the canteen service on campus, you should write at least 100 words, -
The Best Thing That Could Ever Happen少兒雙語閱讀
Unit 3 The Best Thing That Could Ever Happen單元 3 最棒的事Three old men were sitting around and talking.三個老頭坐在一起聊天。The 80-year-old remarked, "The best thing that could happen to me would j