用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 相关文章推荐
分享PHP入门的学习方法
Jan 02 PHP
php Static关键字实用方法
Jun 04 PHP
php 随机排序广告的实现代码
May 09 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
php生成验证码,缩略图及水印图的类分享
Apr 07 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
Laravel创建数据库表结构的例子
Oct 09 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 set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
详解JavaScript正则表达式之分组匹配及反向引用
2016/03/09 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
详解JS模块导入导出
2017/12/20 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
基于python OpenCV实现动态人脸检测
2018/05/25 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
python 实现多维数组转向量
2019/11/30 Python
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
管理专员自荐信
2014/01/26 职场文书
政治学求职信
2014/06/03 职场文书
运动员获奖感言
2014/08/15 职场文书
全国助残日活动总结
2015/05/11 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python