Friends who develop PHP know that the most worrying thing is that there are some exceptions or errors in the program. If these conditions are output to the user's screen, the user will be frightened and even lose their job. If they are not output to the screen, they will have to think about it. The method is to record it in the log, but it seems that not everyone has the habit of checking the error log. In order to solve this embarrassing problem, I wrote this code. Its purpose is to capture the error content when the PHP program we wrote makes an error. Come out and send it to our email.
See the effect first:
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{
/**
General error handling
Parameters:
What to output, whether to terminate the program
Description:
When a value is passed, this function can be used to output customized error content
In addition, you can also cooperate with Register_shutdown_function to automatically capture error content and send the captured error content to Email
The mechanism of Register_shutdown_function is to call the function when the program completes execution or an error occurs during the process
If it is an automatic capture error, it will be Called, the last error content will be obtained. If no error content is found,
will pop out. Return:
The content will be output directly to the screen or email.
Usage:
Fun::Error(' Error content');
Fun::Error('Error content',False);
/**/
Public Static Function Error($M='',$E=True){
$ErrTpl='
';
$M=Trim($M);
IF($M!='') {//手工调用
$M='
注意: '.$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) ? '
'.(($M['line']-3)+($i+1)).'' : (($M['line']-3)+($i+1));
$E['M'].=': '.Htmlspecialchars($E[$i],ENT_QUOTES,'UTF-8').'
';
}
$E=&$E['M'];
$M='
自动捕捉到有错误产生!错误描述: '.$M['file'].'的第
'.$M['line'].'行出现了类型为
'.$M['type'].'的错误:
'.$M['message'].'
关键代码:'.$E.'
'.self::now('Y-m-d H:i:s',time()).'
';
$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 程式错误!
'.$M);
}
IF(SYS_DEBUG) {Echo $M;}
unSet($E,$M,$G);
Die();
}
}
/**
Send email
Parameters:
Recipient, email title (no line breaks), email content (lines must be separated by n, each line cannot exceed 70 characters)
Description:
Call the PHP built-in function Mail to send an email
Return:
Return a Boolean value
Usage:
$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');
}
}