PHP中set error handler函数用法小结


Posted in PHP onNovember 11, 2015

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

 下面抽点空给大家介绍单独介绍PHP set_error_handler() 函数

 定义和用法

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 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
mysql 字段类型说明
Apr 27 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php学习笔记之 函数声明
Jun 09 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
php网站地图生成类示例
Jan 13 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
PHP闭包函数详解
Feb 13 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
laravel开发环境homestead搭建过程详解
Jul 03 PHP
PHP 时间处理类Carbon
May 20 PHP
php实现Session存储到Redis
Nov 11 #PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 #PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
Nov 11 #PHP
深入php内核之php in array
Nov 10 #PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 #PHP
php实现可运算的验证码
Nov 10 #PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 #PHP
You might like
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
smarty内置函数section的用法
2015/01/22 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
目标管理责任书
2014/04/15 职场文书
汽修专业自荐信
2014/07/07 职场文书
法定代表人证明书
2014/11/28 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
团组织推优材料
2014/12/29 职场文书
刑事上诉状范文
2015/05/22 职场文书
PyMongo 查询数据的实现
2021/06/28 Python