用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 smarty模版引擎中的缓存应用
Dec 02 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
PHP技术开发微信公众平台
Jul 22 PHP
php文件上传你必须知道的几点
Oct 20 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 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迭代器的内部执行过程详解
2013/11/12 PHP
php调用C代码的实现方法
2014/03/11 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
python模糊图片过滤的方法
2018/12/14 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
浅谈Python中的继承
2020/06/19 Python
Python 忽略文件名编码的方法
2020/08/01 Python
python图片合成的示例
2020/11/09 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
主管职责范文
2013/11/09 职场文书
安全员岗位职责
2013/11/11 职场文书
工作失误检讨书范文大全
2014/01/13 职场文书
抄作业检讨书
2014/02/17 职场文书
大学开学计划书
2014/04/30 职场文书
平面设计师岗位职责
2014/09/18 职场文书
建国大业观后感
2015/06/01 职场文书
和谐拯救危机观后感
2015/06/15 职场文书