在写开发的时候难免会出现代码写错的尴尬,这里面如果不是在运行环境的话,我们可以直接使用以下的命令来直接显示错误在页面上
ini_set('display_errors',1); //错误信息
ini_set('display_startup_errors',1); //php启动错误信息
error_reporting(-1); //打印出所有的 错误信息
这样子我们就可以直接看见错误信息了,但是这个情况其实是很少出现的。毕竟这样子做是一种不好的方法。毕竟错误都是要写日志的,有日志我们才能清楚程序哪个地方出现bug了。而且程序上线的时候未必能够找到全部bug,这里写日志的方式就非常的好。
想要使用日志的方式,我们可以使用php的错误处理函数
这里面我直接截取php官网上的set_error_handler的文档。所以根据上面的文档我们可以使用它来实现错误处理。实现代码如下:
// error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
$str = date('Y-m-d H:i:s',time()).' ';
switch ($errno) {
case E_USER_ERROR:
$str .= "<b>My ERROR</b> [$errno] $errstr<br />\n"
." Fatal error on line $errline in file $errfile"
.", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"
."Aborting...<br />\n";
file_put_contents(dirname(dirname(__FILE__)).'/error_log.txt',$str,FILE_APPEND | LOCK_EX);
exit(1);
break;
case E_USER_WARNING:
$str .= "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
$str .= "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
$str .= "Unknown error type: [$errno] $errstr<br />\n"." Fatal error on line $errline in file $errfile"
.", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
break;
}
file_put_contents(dirname(dirname(__FILE__)).'/error_log.txt',$str,FILE_APPEND | LOCK_EX);
/* Don't execute PHP internal error handler */
return true;
}
// set to the user defined error handler
$error_handler = set_error_handler("myErrorHandler");
这样子我们就可以使用file_put_contents将错误代码写入文件里面了。但是这里面要注意一个问题,php5版本中set_error_handler不会处理E_ERROR错误,所以这里面如个是出现了Fatal Error 的话,这个函数是无法处理的。php7可以使用set_exception_handler函数来进行处理,但是php5却没有这个函数。这里面我们可以使用register_shutdown_function函数来进行处理。具体实现代码如下:
/*
* 因为php5无法接受E_ERROR错误,所以需要以下函数
*/
register_shutdown_function("shutdown_handler");
function shutdown_handler() {
define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR |
E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE);
$error = error_get_last();
if ($error && ($error["type"] === ($error["type"] & E_FATAL))) {
$errno = $error["type"];
$errfile = $error["file"];
$errline = $error["line"];
$errstr = $error["message"];
myErrorHandler($errno, $errstr, $errfile, $errline);
}
}
这样子我们就可以对Fatal Error错误也进行写入日志了。而且安全性也得到了提高,不会显示错误在浏览器里面。如果你对于错误的处理是非常重视的,一出现错误就要处理的。那么这里面还可以继续编写代码。例如:我的错误信息写入日志后,我要立即知道,那么这里面我们还可以写一个邮件发送的功能在里面,只要出现错误,立即发送错误代码给管理员进行处理。这里面系统如果是很大的话,还可以使用消息队列来进行发送邮件。