用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 email邮箱正则
Oct 08 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
php获取域名的google收录示例
Mar 24 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
cakephp常见知识点汇总
Feb 24 PHP
php strftime函数的详细用法
Jun 21 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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语法(1)
2006/10/09 PHP
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php url路由入门实例
2014/04/23 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
Prototype 学习 Prototype对象
2009/07/12 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python中模块与包有相同名字的处理方法
2017/05/05 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
Python __slots__的使用方法
2020/11/15 Python
《花瓣飘香》教学反思
2014/04/15 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
单位婚育证明范本
2014/11/21 职场文书
入党现实表现材料
2014/12/23 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书