用PHP即时捕捉PHP中的错误并发送email通知的实现代码


Posted in PHP onJanuary 19, 2013

开发PHP的朋友都知道,其实最担心的就是程序中出现一些异常或错误,这些状况如果输出到用户的萤幕会把用户给吓坏,甚至为此丢了工作,如果不输出到萤幕就得想办法记录到日志中,但是似乎不是每个人都有查看错误日志的习惯,??了解决这个尴尬的问题,所以我写了这段代码,其用意就是当我们写的php程式出错的时候把错误内容捕捉出来然后发到我们的email内.

先看效果:
用PHP即时捕捉PHP中的错误并发送email通知的实现代码

Define('SYS_DEBUG',false); 
IF(SYS_DEBUG) { 
ini_set('display_errors','on'); 
Error_reporting(E_ALL);//上线后使用该设定Error_reporting(E_ERROR | E_WARNING | E_PARSE); 
}Else{ 
ini_set('display_errors','off'); 
Error_reporting(0); 
} //错误捕捉 
Register_shutdown_function('Fun::Error'); 
Class Fun{ 
/** 
通用出错处理 
参数: 
要输出的内容,是否终止执行程序 
说明: 
有传值时该函式可以用来输出自定义的错误内容 
另外还可以配合Register_shutdown_function实现自动抓取错误内容,并将抓取的错误内容发送到Email内 
Register_shutdown_function的机制是程序执行完毕或中途出错时调用函数 
如果是自动抓取错误时被调用,则会取得最后一次出错的内容,如果发现没有错误内容则跳出 
返回: 
内容会被直接输出至萤幕或Email内 
用法: 
Fun::Error('错误内容'); 
Fun::Error('错误内容',False); 
/**/ 
Public Static Function Error($M='',$E=True){ 
$ErrTpl='<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><table cellspacing="0" cellpadding="0" border="0"><tr><td style="padding:5px;background-color:#F57900;font-size:13px;border:1px solid #444;color:#222;">{$M}</td></tr></table>'; 
$M=Trim($M); 
IF($M!='') {//手工调用 
$M=' <b>注意:</b> '.$M; 
Echo Strtr($ErrTpl,Array('{$M}'=>$M));unSet($ErrTpl); 
IF($E===True) {Die();} 
Return ; 
}Else{//程式执行完毕自动抓取错误时调用 
$M=error_get_last();//取得最后产生的错误 
IF(!Is_array($M) Or Count($M)<4) {Unset($M);Return ;} 
IF(!File_Exists($M['file'])) {Unset($M);Return ;} 
//取得5行出错关键代码,如果取不到内容,说明出错档桉不存在 
$E=Array_slice(File($M['file']),($M['line']-4),5); 
IF(!Is_array($E)) {Unset($M,$E);Return ;} 
$E['M']=''; 
For($i=0;$i<5;$i++) { 
$E[$i]=isSet($E[$i]) ? $E[$i] : ''; 
$E['M'].='  '; 
$E['M'].=($i==3) ? '<b>'.(($M['line']-3)+($i+1)).'</b>' : (($M['line']-3)+($i+1)); 
$E['M'].=': '.Htmlspecialchars($E[$i],ENT_QUOTES,'UTF-8').'<br>'; 
} 
$E=&$E['M']; 
$M='<b>自动捕捉到有错误产生!</b><br><br><b>错误描述:</b><br>  <b>'.$M['file'].'</b>的第<b>'.$M['line'].'</b>行出现了类型为<b>'.$M['type'].'</b>的错误:<br>  '.$M['message'].'<br><br><b>关键代码:</b><br>'.$E.'<br>'.self::now('Y-m-d H:i:s',time()).'<br>'; 
$M=Strtr($ErrTpl,Array('{$M}'=>$M));unSet($ErrTpl); 
$G=seft::getG('SYS','config'); 
IF(!self::Mail2($G['Spe'],'警告: '.$G['Tit'].' 出现 PHP 程式错误!',$M) And SYS_DEBUG===True){ 
throw new Exception('警告: '.$G['Tit'].' 出现 PHP 程式错误!<br><br>'.$M); 
} 
IF(SYS_DEBUG) {Echo $M;} 
unSet($E,$M,$G); 
Die(); 
} 
} 
/** 
发送电邮 
参数: 
收件人,邮件标题(不可有换行符),邮件内容(行与行之间必须用\n分隔,每行不可超过70个字符) 
说明: 
调用PHP内置函式Mail发送电邮 
返回: 
返回布尔值 
用法: 
$IsSend=Fun::Mail2($email,$tit,$msg); 
/**/ 
Public Static Function Mail2($to,$tit,$msg) { 
IF(Filter_var($to,FILTER_VALIDATE_EMAIL)==''){ 
throw new Exception('电邮地址错误!'); 
} 
$tit='=?UTF-8?B?'.Base64_Encode($tit).'?='; 
$msg = str_replace("\n.","\n..",$msg); //Windows如果在一行开头发现一个句号则会被删掉,要避免此问题将单个句号替换成两个句号 
Return Mail($to,$tit,$msg,'From:'.seft::getG('config/SYS/Mal')."\n".'Content-Type:text/html;charset=utf-8'); 
} 
}
PHP 相关文章推荐
其他功能
Oct 09 PHP
php 图像函数大举例(非原创)
Jun 20 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
php批量缩放图片的代码[ini参数控制]
Feb 11 PHP
将二维数组转为一维数组的2种方法
May 26 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
php实现的CSS更新类实例
Sep 22 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
php文件上传 你真的掌握了吗
Nov 28 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 PHP
PHP中CURL方法curl_setopt()函数的参数分享
Jan 19 #PHP
php牛逼的面试题分享
Jan 18 #PHP
APACHE的AcceptPathInfo指令使用介绍
Jan 18 #PHP
php图片加水印原理(超简单的实例代码)
Jan 18 #PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 #PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 #PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 #PHP
You might like
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
jqTransform美化表单
2015/10/10 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
webpack4的迁移的使用方法
2018/05/25 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
详解微信UnionID作用
2019/05/15 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
基于python socketserver框架全面解析
2017/09/21 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
python实现Adapter模式实例代码
2018/02/09 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
Linux文件操作命令都有哪些
2016/07/23 面试题
物业总经理岗位职责
2014/02/28 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
考博导师推荐信范文
2015/03/27 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis