PHP set_error_handler()函数使用详解(示例)

 更新时间:2013年11月12日 14:10:32   作者:  
本文详细介绍PHP set_error_handler()函数的使用方法,最后还提供了一个实例
我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。
但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。
有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。那么,有啥解决办法呢?
set_error_handler()
PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道。set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。
可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
可以记下错误的信息, 及时发现一些生产环境的出现的问题。
可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。
可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。
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); 

您可能感兴趣的文章:

相关文章

  • php中session定期自动清理的方法

    php中session定期自动清理的方法

    这篇文章主要介绍了php中session定期自动清理的方法,如何设置php实现session定期自动清理,本文会给大家详细介绍,需要的朋友可以参考下
    2015-11-11
  • php微信支付之APP支付方法

    php微信支付之APP支付方法

    这篇文章主要介绍了php微信支付之APP支付方法,实例分析了php微信支付接口文件及使用技巧,需要的朋友可以参考下
    2015-03-03
  • PHP+mysql实现从数据库获取下拉树功能示例

    PHP+mysql实现从数据库获取下拉树功能示例

    这篇文章主要介绍了PHP+mysql实现从数据库获取下拉树功能,结合实例形式分析了php+mysql数据库查询及select下拉框输出查询结果的实现技巧,需要的朋友可以参考下
    2017-01-01
  • Linux下安装PHP MSSQL扩展教程

    Linux下安装PHP MSSQL扩展教程

    这篇文章主要介绍了Linux下安装PHP MSSQL扩展教程,本文环境是SUSE Linux Enterprise Server 10 SP3,其它系统也类似,需要的朋友可以参考下
    2014-10-10
  • PHP simple_html_dom.php+正则 采集文章代码

    PHP simple_html_dom.php+正则 采集文章代码

    网上也有很多人也在用PHP Simple Dom 虽然效率慢了点,但效果还是不错的从包含类库文件到写入txt文件 大概是7/8就秒。
    2009-12-12
  • php获取post中的json数据的实现方法

    php获取post中的json数据的实现方法

    最近用到ext与PHP交互,ext把json数据post给PHP,但在PHP里面$_post获取不到,$_REQUEST也获取不到,但是通过firedebug看到的请求信息确实是把JSON数据post给了PHP,这什么情况
    2011-06-06
  • php中取得文件的后缀名?

    php中取得文件的后缀名?

    今天给学员讲课,关于数组的应用举例,说了怎样取得一个文件的后缀名,总结一下,方法挺多的,下面分享给大家
    2012-02-02
  • 隐性调用php程序的方法

    隐性调用php程序的方法

    这篇文章主要介绍了隐性调用php程序的方法,实例分析了通过js文件调用php程序实现计数功能,需要的朋友可以参考下
    2015-06-06
  • php rmdir使用递归函数删除非空目录实例详解

    php rmdir使用递归函数删除非空目录实例详解

    我们大家都知道,php rmdir()函数用于删除空目录,但如果要删除非空目录,我们必须将非空目录中的文件或子目录删除,本文章向大家介绍php如何使用递归函数删除非空目录,需要的朋友可以参考一下
    2016-10-10
  • 关于查看MSSQL 数据库 用户每个表 占用的空间大小

    关于查看MSSQL 数据库 用户每个表 占用的空间大小

    本篇文章是对查看MSSQL数据库用户每个表占用的空间大小进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论