搜尋
首頁後端開發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/stasdf.php [line] => 67 ),頁的絕對路徑最好不要暴露給別人,不然給有些人可稱之機,為了杜絕這一點,好多人都會採用,ini_set("display_errors",0);直接把錯誤訊息給屏蔽掉了。這樣就不方便了,如果要看資訊怎麼辦呢?每次查看的時候,是不是都要改一下程式碼,或是改一下apache的配置,在重起呢?

php有函數set_error_handler可以解決這個問題

用法如下:

mixed set_error_handler ( callback $error_handler [, int $error_types = EpALL |這個問題

用法如下:

int register_shutdown_function ( string $func )

個人覺得報錯函數自己定義,至少有三點好處,

1,不會把文件的絕對路徑顯示出來, ,即使真的出現了錯誤訊息,我們可以對錯誤訊息進行處理,讓使用者也看不到fatal error這樣的東西。使用者體驗好

3,專案上線後,有的時候,你還是要幫用戶去解決問題,這個時候難免要去修改程式碼,但是我們又要讓錯誤訊息報出來,又不能讓使用者看到,這時候,用set_error_handler這樣的函數就很爽了。

個人做了一個小測試

<?php
 error_reporting(0);
register_shutdown_function(&#39;error_alert&#39;);
 function error_alert()
 {
 if(is_null($e = error_get_last()) === false)
 {
 set_error_handler(&#39;errorHandler&#39;);
 if($e[&#39;type&#39;] == 1){
 trigger_error("fatal error", E_USER_ERROR);
 }elseif($e[&#39;type&#39;] == 8){
 trigger_error("notice", E_USER_NOTICE);
 }elseif($e[&#39;type&#39;] == 2){
 trigger_error("warning", E_USER_WARNING);
 }else{
 trigger_error("other", E_USER_OTHER);
 }
 }else{
 echo "no error";
 }
 }
 set_error_handler(&#39;errorHandler&#39;);
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&#39;t refer to $this
 }
 }
  
function NonClassFunction($errno, $errstr, $errfile, $errline) {
 }
 // 三种方法如下:
  
 set_error_handler(‘NonClassFunction&#39;); // 直接转到一个普通的函数 NonClassFunction
 set_error_handler(array(‘CallbackClass&#39;, ‘StaticFunction&#39;)); // 转到 CallbackClass 类下的静方法 StaticFunction
 $o =& new CallbackClass();
 set_error_handler(array($o, ‘CallbackFunction&#39;)); // 转到类的构造函数,其实本质上跟下面的第四条一样。
. $o = new CallbackClass();
// The following may also prove useful
class CallbackClass {
 function CallbackClass() {
 set_error_handler(array(&$this, ‘CallbackFunction&#39;)); // the & is important
 }
function CallbackFunction() {
 // refers to $this
 }
 }

 下面抽空給大家介紹單獨介紹PHP set_error_handler() 函數

使用者自訂的錯誤處理函數。

此函數用於建立運行時期間的使用者自己的錯誤處理方法。

該函數會傳回舊的錯誤處理程序,若失敗,則傳回 null。

語法

set_error_handler(error_function,error_types)

參數 描述

error_function 必要。規定發生錯誤時運行的函數。

error_types 可選。規定在哪個錯誤報告等級會顯示使用者定義的錯誤。預設是 "E_ALL"。

提示和註解

提示:如果使用了函數,則會完全繞過標準的 PHP 錯誤處理函數,如果必要,使用者定義的錯誤處理程序必須終止 (die() ) 腳本。

註解:如果在腳本執行前發生錯誤,由於在那時自訂程式還沒有註冊,因此就不會用到這個自訂錯誤處理程序。

範例

<?php
//error handler function
function customError($errno, $errstr, $errfile, $errline)
 { 
 echo "<b>Custom error:</b> [$errno] $errstr<br />";
 echo " Error on line $errline in $errfile<br />";
 echo "Ending Script";
 die();
 }
//set error handler
set_error_handler("customError");
$test=2;
//trigger error
if ($test>1)
 {
 trigger_error("A custom error has been triggered");
 }
?>

输出:

Custom error: [1024] A custom error has been triggered
Error on line 19 in C:/webfolder/test.php
Ending Script

更多PHP中set error handler函数用法小结相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具