目錄
set_error_handler()
首頁 後端開發 php教程 PHP set_error_handler()函数的使用_PHP教程

PHP set_error_handler()函数的使用_PHP教程

Jul 13, 2016 am 10:34 AM
set_error_handler 報錯

我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。

但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。

有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。

那么,有啥解决办法呢?

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])
登入後複製

现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量$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,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。

原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:

  1. E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编 译或PHP内核出错,在通常情况下不会发生。
  2. 使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。

最后,原作者又给出了一个示例(真是个认真负责的好人哈。)

//先定义一个函数,也可以定义在其他的文件中,再用require()调用  
function myErrorHandler($errno, $errstr, $errfile, $errline)  
{  
     //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径  
    $errfile=str_replace(getcwd(),"",$errfile);  
    $errstr=str_replace(getcwd(),"",$errstr);  
  
    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";  
        echo "Aborting...<br />\n";  
        exit(1);  
        break;  
  
    case E_USER_WARNING:  
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";  
        break;  
  
    case E_USER_NOTICE:  
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";  
        break;  
  
    default:  
        echo "Unknown error type: [$errno] $errstr<br />\n";  
        break;  
    }  
  
    /* Don't execute PHP internal error handler */  
    return true;  
}  
  
//下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。  
$link_id=@mysql_pconnect("localhost:3333","root","password");  
set_error_handler(myErrorHandler);  
if (!$link_id) {  
    trigger_error("出错了", E_USER_ERROR);  
}  
登入後複製

好了,总结一下,下面是 set_error_handler 三种用法:

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  
   }  
}  
登入後複製

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752326.htmlTechArticle我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Column count doesn't match value count at row 1 - 如何解決MySQL報錯:列數與值不符 Column count doesn't match value count at row 1 - 如何解決MySQL報錯:列數與值不符 Oct 05, 2023 am 11:40 AM

Column count doesn't match value count at row 1 - 如何解決MySQL報錯:列數與值不符

Incorrect table definition; there can be only one auto column and it must be defined as a key - 如何解決MySQL報錯:錯誤的表定義;只能有一個自動列,並且必須定義為鍵 Incorrect table definition; there can be only one auto column and it must be defined as a key - 如何解決MySQL報錯:錯誤的表定義;只能有一個自動列,並且必須定義為鍵 Oct 05, 2023 am 11:05 AM

Incorrect table definition; there can be only one auto column and it must be defined as a key - 如何解決MySQL報錯:錯誤的表定義;只能有一個自動列,並且必須定義為鍵

mysql報錯10060 mysql報錯10060 Sep 12, 2023 am 11:00 AM

mysql報錯10060

原因分析:HTTP請求錯誤504網關逾時 原因分析:HTTP請求錯誤504網關逾時 Feb 19, 2024 pm 05:12 PM

原因分析:HTTP請求錯誤504網關逾時

解決方案:處理HTTP請求時出現的Socket Error 解決方案:處理HTTP請求時出現的Socket Error Feb 25, 2024 pm 09:24 PM

解決方案:處理HTTP請求時出現的Socket Error

Unknown column 'column_name' in 'where clause' - 如何解決MySQL報錯:where子句中的未知列 Unknown column 'column_name' in 'where clause' - 如何解決MySQL報錯:where子句中的未知列 Oct 05, 2023 am 11:15 AM

Unknown column 'column_name' in 'where clause' - 如何解決MySQL報錯:where子句中的未知列

快速解決pyqt5安裝錯誤的步驟指南 快速解決pyqt5安裝錯誤的步驟指南 Jan 19, 2024 am 09:32 AM

快速解決pyqt5安裝錯誤的步驟指南

Unknown database 'database_name' - 如何解決MySQL報錯:未知資料庫名 Unknown database 'database_name' - 如何解決MySQL報錯:未知資料庫名 Oct 05, 2023 am 09:45 AM

Unknown database 'database_name' - 如何解決MySQL報錯:未知資料庫名

See all articles