MyErrorHandler.php
<?php
class MyErrorHandler
{
public $message = '';
public $filename = '';
public $line = 0;
public $var = array();
protected $_noticeLog = 'D:\error\noticeLog.log';
public function __construct($message, $filename, $line, $vars)
{
$this->message = $message;
$this->filename = $filename;
$this->line = $line;
$this->vars = $vars;
}
public static function deal($errno, $errmsg, $filename, $line, $vars)
{
$self = new self($errmsg, $filename, $line, $vars);
switch ($errno) {
case E_USER_ERROR:
return $self->dealError();
break;
case E_USER_WARNING:
case E_WARNING:
return $self->dealWaining();
break;
case E_NOTICE:
case E_USER_NOTICE:
return $self->dealNotice();
break;
default:
return false;
}
}
/**
* 如何处理致命错误
*/
public function dealError()
{
ob_start();//打开输出缓冲区,所有的输出信息不在直接发送到浏览器
debug_print_backtrace();//打印 PHP回溯
$backtrace = ob_get_flush();
$errorMsg = <<<EOF
出现了致命错误,如下:
产生错误的文件:{$this->filename}
产生错误的信息:{$this->message}
产生错误的行号:{$this->line}
追踪信息:{$backtrace}
EOF;
error_log($errorMsg, 1, '403133112@qq.com');
exit(1);
}
/**
* 如何处理警告
*/
public function dealWarning()
{
$errorMsg = <<<EOF
出现了警告错误,如下
产生警告的文件:{$this->filename}
产生警告的信息:{$this->message}
产生警告的行号:{$this->line}
EOF;
return error_log($errorMsg, 1, '403133112@qq.com');
}
/**
* 如何处理通知级别的错误
*/
public function dealNotice()
{
$dateTime = date("Y-m-d H:i:s", time());
$errorMsg = <<<EOF
出现了通知错误,如下:
产生通知的文件:{$this->filename}
产生通知的信息:{$this->message}
产生通知的行号:{$this->line}
产生通知的时间:{$dateTime}
EOF;
return error_log($errorMsg, 3, $this->_noticeLog);
}
}
?>
test.php
<?php
header('content-type:text/html:charset=utf-8');
require_once 'MyErr orHandler.php';
error_reporting(-1);
ini_set('display_errors', 0);
set_error_handler(array('MyErrorHandler', 'deal'));
echo $test;
//settype($var, 'king');
//test();
trigger_error('我是手动抛出的致命错误', E_USER_ERROR);//邮件接收
echo "this is a test";//无执行
?>