PHP 自定義錯誤機制

2021-07-25 05:09:33 字數 3152 閱讀 5163

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的使用方法如下:

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/stasdf.php [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()

elseif($e['type'] == 8)elseif($e['type'] == 2)else

}else

} set_error_handler('errorhandler');

function errorhandler($errno, $errstr, $errfile, $errline,$errcontext)

return true;

} class someclass

} someclass::somemedthod();

$a="asdf";

foreach($a as $d)

?>

現在我們就用自定義的錯誤處理把實際路徑過濾掉,假設有乙個變數$admin,我們是用來判斷訪問者是否是管理員的(可以通過ip或者登入的使用者id來做這個判斷).

admin為管理員的身份判定,true為管理員.

自定義的錯誤處理函式一定要有這4個輸入變數$errno,$errstr,$errfile,$errline,否則無效.

function my_error_handler($errno,$errstr,$errfile,$errline)

switch($errno) }

這樣就自定義了乙個錯誤處理函式,那麼怎麼把錯誤的處理交給這個自定義函式呢?

應用到類

示例的做法

set_error_handler("my_error_handler");

so easy,這樣,就可以很好地解決安全和除錯方便的矛盾了,而且你還可以花點心思,使錯誤提示更加美觀以配合**的風格.

上面的例子中,我把錯誤資訊關掉了,而用自己的函式處理錯誤,上面的這個頁面會報fatal error,報出來的錯誤資訊我們是可以利用errorhandler來控制和處理.

好了,總結一下,下面是 set_error_handler 三種用法:

class callbackclass

function staticfunction()

} 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 callbackfunction()

}

PHP 錯誤丟擲及自定義處理

php中的錯誤丟擲及自定義處理指的是允許我們自定義丟擲錯誤並且捕捉錯誤並進行處理。類似於 物件導向語言中的throw 及 try.catch.在php中主要由以下三個函式來完成丟擲以及捕捉處理.trigger error set exception handler set error handle ...

簡單的php自定義錯誤日誌

平時經常看php的錯誤日誌,很少有機會去自己動手寫日誌,看了王健的 最佳日誌實踐 覺得寫乙個清晰明了,結構分明的日誌還是非常有必要的。在寫日誌前,我們問問自己 為什麼我們有時要記錄自定義的日誌呢?而不用系統預設的日誌記錄方式呢?我認為有兩個原因 1.團隊需要乙個統一格式的日誌方便管理 2.大量無用錯...

PHP的錯誤級別與自定義錯誤處理

級別常量 錯誤值錯誤描述 e error 1致命的執行錯誤 阻止指令碼繼續執行 e warning 2執行時警告 e parse 4從語法中解析錯誤 e notice 8執行時注意訊息 e core error 16php啟動時初始化過程中的致命錯誤 e core warning 32php啟動時初...