首页 > php教程 > php手册 > 正文

用PHP即時捕捉PHP原始碼中的錯誤并發送email通知

php中文网
发布: 2016-05-30 16:59:45
原创
1158人浏览过

開發php的朋友都知道,其實最擔心的就是程序中出現一些異常或錯誤,這些狀況如果輸出到用戶的螢幕會把用戶給嚇壞,甚至為此丟了工作,如果不輸出到螢幕就得想辦法記錄到日誌中,但是似乎不是每個人都有查看錯誤日誌的習慣,爲了解決這個尷尬的問題,所以我寫了這段代碼,其用意就是當我們寫的php程式出錯的時候把錯誤內容捕捉出來然後發到我們的email內.
先看效果:

 

<span style="color: #008080;">Define</span>('SYS_DEBUG',<span style="color: #0000ff;">false</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">IF</span><span style="color: #000000;">(SYS_DEBUG) {
</span><span style="color: #008080;">ini_set</span>('display_errors','on'<span style="color: #000000;">);
</span><span style="color: #008080;">Error_reporting</span>(<span style="color: #ff00ff;">E_ALL</span>);<span style="color: #008000;">//</span><span style="color: #008000;">上線后使用該設定Error_reporting(E_ERROR | E_WARNING | E_PARSE);</span>
}<span style="color: #0000ff;">Else</span><span style="color: #000000;">{
</span><span style="color: #008080;">ini_set</span>('display_errors','off'<span style="color: #000000;">);
</span><span style="color: #008080;">Error_reporting</span>(0<span style="color: #000000;">);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">錯誤捕捉</span>
<span style="color: #008080;">Register_shutdown_function</span>('Fun::Error'<span style="color: #000000;">);

</span><span style="color: #0000ff;">Class</span><span style="color: #000000;"> Fun{

</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
通用出錯處理
参数:
要輸出的內容,是否終止執行程序
說明:
有傳值時該函式可以用來輸出自定義的錯誤內容
另外還可以配合Register_shutdown_function實現自動抓取錯誤內容,並將抓取的錯誤內容發送到Email內
Register_shutdown_function的機制是程序執行完畢或中途出錯時調用函數
如果是自動抓取錯誤時被調用,則會取得最後一次出錯的內容,如果發現沒有錯誤內容則跳出
返回:
內容會被直接輸出至螢幕或Email內
用法:
Fun::Error('錯誤內容');
Fun::Error('錯誤內容',False);
/*</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">Public</span> <span style="color: #0000ff;">Static</span> <span style="color: #0000ff;">Function</span> Error(<span style="color: #800080;">$M</span>='',<span style="color: #800080;">$E</span>=<span style="color: #0000ff;">True</span><span style="color: #000000;">){
</span><span style="color: #800080;">$ErrTpl</span>='<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>'<span style="color: #000000;">;

</span><span style="color: #800080;">$M</span>=<span style="color: #008080;">Trim</span>(<span style="color: #800080;">$M</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">IF</span>(<span style="color: #800080;">$M</span>!='') {<span style="color: #008000;">//</span><span style="color: #008000;">手工調用</span>
<span style="color: #800080;">$M</span>=' <b>注意:</b> '.<span style="color: #800080;">$M</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">Echo</span> <span style="color: #008080;">Strtr</span>(<span style="color: #800080;">$ErrTpl</span>,<span style="color: #0000ff;">Array</span>('{$M}'=><span style="color: #800080;">$M</span>));<span style="color: #0000ff;">unSet</span>(<span style="color: #800080;">$ErrTpl</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">IF</span>(<span style="color: #800080;">$E</span>===<span style="color: #0000ff;">True</span>) {<span style="color: #0000ff;">Die</span><span style="color: #000000;">();}
</span><span style="color: #0000ff;">Return</span><span style="color: #000000;"> ;
}</span><span style="color: #0000ff;">Else</span>{<span style="color: #008000;">//</span><span style="color: #008000;">程式執行完畢自動抓取錯誤時調用</span>
<span style="color: #800080;">$M</span>=error_get_last();<span style="color: #008000;">//</span><span style="color: #008000;">取得最後產生的錯誤</span>
<span style="color: #0000ff;">IF</span>(!<span style="color: #008080;">Is_array</span>(<span style="color: #800080;">$M</span>) Or <span style="color: #008080;">Count</span>(<span style="color: #800080;">$M</span>)<4) {<span style="color: #0000ff;">Unset</span>(<span style="color: #800080;">$M</span>);<span style="color: #0000ff;">Return</span><span style="color: #000000;"> ;}
</span><span style="color: #0000ff;">IF</span>(!<span style="color: #008080;">File_Exists</span>(<span style="color: #800080;">$M</span>['file'])) {<span style="color: #0000ff;">Unset</span>(<span style="color: #800080;">$M</span>);<span style="color: #0000ff;">Return</span><span style="color: #000000;"> ;}

</span><span style="color: #008000;">//</span><span style="color: #008000;">取得5行出錯關鍵代碼,如果取不到內容,說明出錯檔案不存在</span>
<span style="color: #800080;">$E</span>=<span style="color: #008080;">Array_slice</span>(<span style="color: #008080;">File</span>(<span style="color: #800080;">$M</span>['file']),(<span style="color: #800080;">$M</span>['line']-4),5<span style="color: #000000;">);
</span><span style="color: #0000ff;">IF</span>(!<span style="color: #008080;">Is_array</span>(<span style="color: #800080;">$E</span>)) {<span style="color: #0000ff;">Unset</span>(<span style="color: #800080;">$M</span>,<span style="color: #800080;">$E</span>);<span style="color: #0000ff;">Return</span><span style="color: #000000;"> ;}

</span><span style="color: #800080;">$E</span>['M']=''<span style="color: #000000;">;
</span><span style="color: #0000ff;">For</span>(<span style="color: #800080;">$i</span>=0;<span style="color: #800080;">$i</span><5;<span style="color: #800080;">$i</span>++<span style="color: #000000;">) {
</span><span style="color: #800080;">$E</span>[<span style="color: #800080;">$i</span>]=<span style="color: #0000ff;">isSet</span>(<span style="color: #800080;">$E</span>[<span style="color: #800080;">$i</span>]) ? <span style="color: #800080;">$E</span>[<span style="color: #800080;">$i</span>] : ''<span style="color: #000000;">;
</span><span style="color: #800080;">$E</span>['M'].='  '<span style="color: #000000;">;
</span><span style="color: #800080;">$E</span>['M'].=(<span style="color: #800080;">$i</span>==3) ? '<b>'.((<span style="color: #800080;">$M</span>['line']-3)+(<span style="color: #800080;">$i</span>+1)).'</b>' : ((<span style="color: #800080;">$M</span>['line']-3)+(<span style="color: #800080;">$i</span>+1<span style="color: #000000;">));
</span><span style="color: #800080;">$E</span>['M'].=': '.<span style="color: #008080;">Htmlspecialchars</span>(<span style="color: #800080;">$E</span>[<span style="color: #800080;">$i</span>],ENT_QUOTES,'UTF-8').'<br>'<span style="color: #000000;">;
}
</span><span style="color: #800080;">$E</span>=&<span style="color: #800080;">$E</span>['M'<span style="color: #000000;">];

</span><span style="color: #800080;">$M</span>='<b>自動捕捉到有錯誤產生!</b><br><br><b>錯誤描述:</b><br>  <b>'.<span style="color: #800080;">$M</span>['file'].'</b>的第<b>'.<span style="color: #800080;">$M</span>['line'].'</b>行出現了類型為<b>'.<span style="color: #800080;">$M</span>['type'].'</b>的錯誤:<br>  '.<span style="color: #800080;">$M</span>['message'].'<br><br><b>關鍵代碼:</b><br>'.<span style="color: #800080;">$E</span>.'<br>'.self::now('Y-m-d H:i:s',<span style="color: #008080;">time</span>()).'<br>'<span style="color: #000000;">;

</span><span style="color: #800080;">$M</span>=<span style="color: #008080;">Strtr</span>(<span style="color: #800080;">$ErrTpl</span>,<span style="color: #0000ff;">Array</span>('{$M}'=><span style="color: #800080;">$M</span>));<span style="color: #0000ff;">unSet</span>(<span style="color: #800080;">$ErrTpl</span><span style="color: #000000;">);

</span><span style="color: #800080;">$G</span>=seft::getG('SYS','config'<span style="color: #000000;">);
</span><span style="color: #0000ff;">IF</span>(!self::Mail2(<span style="color: #800080;">$G</span>['Spe'],'警告: '.<span style="color: #800080;">$G</span>['Tit'].' 出現 PHP 程式錯誤!',<span style="color: #800080;">$M</span>) And SYS_DEBUG===<span style="color: #0000ff;">True</span><span style="color: #000000;">){
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>('警告: '.<span style="color: #800080;">$G</span>['Tit'].' 出現 PHP 程式錯誤!<br><br>'.<span style="color: #800080;">$M</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">IF</span>(SYS_DEBUG) {<span style="color: #0000ff;">Echo</span> <span style="color: #800080;">$M</span><span style="color: #000000;">;}
</span><span style="color: #0000ff;">unSet</span>(<span style="color: #800080;">$E</span>,<span style="color: #800080;">$M</span>,<span style="color: #800080;">$G</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">Die</span><span style="color: #000000;">();
}
}
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
发送電郵
参数:
收件人,郵件標題(不可有換行符),郵件內容(行與行之間必須用\n分隔,每行不可超過70個字符)
說明:
調用PHP內置函式Mail發送電郵
返回:
返回布爾值
用法:
$IsSend=Fun::Mail2($email,$tit,$msg);
/*</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">Public</span> <span style="color: #0000ff;">Static</span> <span style="color: #0000ff;">Function</span> Mail2(<span style="color: #800080;">$to</span>,<span style="color: #800080;">$tit</span>,<span style="color: #800080;">$msg</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">IF</span>(Filter_var(<span style="color: #800080;">$to</span>,FILTER_VALIDATE_EMAIL)==''<span style="color: #000000;">){
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>('電郵地址錯誤!'<span style="color: #000000;">);
}

</span><span style="color: #800080;">$tit</span>='=?UTF-8?B?'.<span style="color: #008080;">Base64_Encode</span>(<span style="color: #800080;">$tit</span>).'?='<span style="color: #000000;">;
</span><span style="color: #800080;">$msg</span> = <span style="color: #008080;">str_replace</span>("\n.","\n..",<span style="color: #800080;">$msg</span>);     <span style="color: #008000;">//</span><span style="color: #008000;">Windows如果在一行开头发现一个句号则会被删掉,要避免此问题将单个句号替换成两个句号</span>

<span style="color: #0000ff;">Return</span> <span style="color: #008080;">Mail</span>(<span style="color: #800080;">$to</span>,<span style="color: #800080;">$tit</span>,<span style="color: #800080;">$msg</span>,'From:'.seft::getG('config/SYS/Mal')."\n".'Content-Type:text/html;charset=utf-8'<span style="color: #000000;">);
}


}</span>
登录后复制

 

豆包AI编程
豆包AI编程

智能代码生成与优化,高效提升开发速度与质量!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号