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); 
}

(0)

相关推荐

  • PHP中set error handler函数用法小结

    set_error_handler() 函数设置用户自定义的错误处理函数.该函数用于创建运行时期间的用户自己的错误处理方法.该函数会返回旧的错误处理程序,若失败,则返回 null. 下面来看一些例子. set_error_handler() PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道.set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用. 1.可以用来屏蔽错误. 出现错误一来会把一

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

    我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置.行数和原因.有很多人说,这并没有什么大不了.确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的.但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题.有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极.有些时候,我们的确需要PHP返回错误的信息以便

  • 非常实用的MySQL函数全面总结详解示例分析教程

    目录 1.MySQL中关于函数的说明 2.单行函数分类 3.字符函数 4.数学函数 5.日期时间函数 6.其它常用系统函数 7.流程控制函数 8.聚合函数 1)聚合函数的功能和分类: 2)聚合函数的简单使用 3)五个聚合函数中传入的参数,所支持的数据类型有哪些? 4)聚合函数和group by的使用"最重要": 1.MySQL中关于函数的说明 "概念":类似java.python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名: "好处":

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • JavaScript hasOwnProperty() 函数实例详解

    hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性.如果有,返回true,否则返回false. 该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法. IE 5.5+.FireFox.Chrome.Safari.Opera等主流浏览器均支持该函数. 语法 object.hasOwnProperty( propertyName ) 参数 参数 描述 propertyName Str

  • PHP 7.4 新语法之箭头函数实例详解

    短闭包,也叫做箭头函数,是一种用 php 编写的短函数.当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_filter函数时. 这就是它们看起来的样子: // Post 对象的集合 $posts = [/* - */]; $ids = array_map(fn($post) => $post->id, $posts); 而以前,你必须这样写: $ids = array_map(function ($post) { return $post->id

  • 对Python函数设计规范详解

    Python函数的设计规范 1.Python函数设计时具备耦合性和聚合性 1).耦合性: (1).尽可能通过参数接受输入,以及通过return产生输出以保证函数的独立性: (2).尽量减少使用全局变量进行函数间通信: (3).不要在函数中直接修改可变类型的参数: (4).避免直接改变定义在另外一个模块中的变量: 2).聚合性: (1).每个函数都应该有一个单一的.目的统一的目标: (2).每个函数的功能都应该相对简单: 2.Python函数在脚本中应用示例 例1:将/etc/passwd文件中的

  • python中强大的format函数实例详解

    python中format函数用于字符串的格式化 自python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快速处理各种字符串. 语法 它通过{}和:来代替%. 请看下面的示例,基本上总结了format函数在python的中所有用法 #通过位置 print '{0},{1}'.format('chuhao',20) print '{},{}'.format('chuhao',20) print '{1},{0},{1}'.format('chuhao',20) #

  • python可视化text()函数使用详解

    这篇文章主要介绍了python可视化text()函数使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数功能:添加图形内容细节的无指向型注释文本 调用签名:plt.text(x, y, string, weight="bold", color="b") x: 注释文本内容所在位置的横坐标 y:注释文本内容所在位置的纵坐标 string:注释文本内容 weight:注释文本内容的粗细风格 color:注释文本

  • python isinstance函数用法详解

    这篇文章主要介绍了python isinstance函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 isinstance() 函数来判断一个对象是否是一个已知的类型类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系. isinstance() 会认为子类是一种父类类型,考虑继承关系. 如果要判断两个类型是否相同推荐使用 isinstance(). 语法

  • C++ min/max_element 函数用法详解

    同样是O(n)复杂度,但是经过不严谨 测试,使用库函数的速度远超for循环的遍历找最值 /* param begin : 序列起始地址(迭代器) param end : 序列结束地址(迭代器) return : 序列中最小元素地址(迭代器) */ min_element(begin, end); /* param begin : 序列起始地址(迭代器) param end : 序列结束地址(迭代器) return : 序列中最大元素地址(迭代器) */ max_element(begin, en

随机推荐