用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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
PHP 函数语法介绍一
Jun 14 PHP
php 在文件指定行插入数据的代码
May 08 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 PHP
PHP代码审核的详细介绍
Jun 13 PHP
PHP常用的缓存技术汇总
May 05 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
php简单实现多语言切换的方法
May 09 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 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易混淆函数的区别及用法汇总
2014/11/22 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
Python实现JSON反序列化类对象的示例
2018/01/31 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
实例详解Python装饰器与闭包
2019/07/29 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
日语求职信范文
2013/12/17 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
python神经网络Xception模型
2022/05/06 Python