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 相关文章推荐
我的论坛源代码(十)
Oct 09 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
简单谈谈favicon
Jun 10 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 PHP
PHP标准库 (SPL)――Countable用法示例
Jun 05 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 mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Python与shell的3种交互方式介绍
2015/04/11 Python
python从sqlite读取并显示数据的方法
2015/05/08 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
大学生年度自我鉴定
2013/10/31 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
研修心得体会
2014/09/04 职场文书
春节慰问简报
2015/07/21 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
python3.9之你应该知道的新特性详解
2021/04/29 Python
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
一篇文章弄懂Python中的内建函数
2021/08/07 Python
JavaScript 原型与原型链详情
2021/11/02 Javascript
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技