用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 skymvc 一款轻量、简单的php
Jun 28 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
php遍历数组的4种方法总结
Jul 05 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
php实现图片按比例截取的方法
Feb 06 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 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 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
php中yii框架实例用法
2020/12/22 PHP
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
详谈js原型继承的一些问题
2017/09/06 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
python的类方法和静态方法
2014/12/13 Python
深入理解Python对Json的解析
2017/02/14 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
Python的log日志功能及设置方法
2019/07/11 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
思想政治自我鉴定
2013/10/06 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
党员自我剖析材料
2014/08/31 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python