参考:php错误处理
在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门如果在本地程,序调试时出现系统致命性错误可以设置error_reporting(E_ALL)来显示所有错误信息,但在服务器中我们是不能这样做的,这样很容易暴露系统信息。
方法一:
我们可以自定义系统报错函数:
set_error_handler(‘errorHandler’,E_ALL | E_STRICT) //设置错误处理器函数errorHandler,可以配合error_log函数实现日志记录功能
参数:
errorhandler 必需。规定用户错误处理函数的名称。
E_ALL|E_STRICT 可选。规定显示何种错误报告级别的用户定义错误。默认是 “E_ALL”。
注:
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错,在通常情况下不会发生
使用set_error_handler()后,error_reporting()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理
方法二:
捕获系统致命性错误:
error_get_last() //获取最后一次发生错误信息
register_shutdown_function(‘fatalErrorHandler’) //在脚本停止执行时注册一个回调函数
该方法可以用于API调试中,记录每次请求值和返回值,方便调试。
注:通过以上两个函数我们用可以监控系统致命性错误,比如服务器500错误,然后并记录到日志文件中。
代码实例:
//禁止错误输出
error_reporting(0);
//设置错误处理器
set_error_handler('errorHandler');
//在脚本结束时运行的函数
register_shutdown_function('fatalErrorHandler');
/**
* 错误处理
* @param int $err_no 错误代码
* @param string $err_msg 错误信息
* @param string $err_file 错误文件
* @param int $err_line 错误行号
* @return string
*/
function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0)
{
$log = [
'['.date('Y-m-d h-i-s').']',
'|',
$err_no,
'|',
$err_msg,
'|',
$err_file,
'|',
$err_line
];
$log_path = '/data/mi/test.txt';
error_log(implode(' ',$log)."\r\n",3, $log_path);
//echo implode(' ',$log)."";
}
/**
* 捕捉致命错误
* @return string
*/
function fatalErrorHandler() {
$e = error_get_last();
switch ($e['type']) {
case 1:
errorHandler($e['type'], $e['message'], $e['file'], $e['line']);
break;
}
}
class DemoClass_1
{
public function index()
{
//这里发生一个警告错误,出发errorHandler
echo $undefinedVarible;
}
}
$demo_1 = new DemoClass_1();
//这里发生一个警告错误,被errorHandler 捕获
$demo_1->index();
//发生致命错误,脚本停止运行触发 fatalErrorHandler
$demo_2 = new DemoClass_2();
$demo_2->index();
方法三:
错误异常的捕获
try{
# 要验证的代码
}catch (\Exception $e){
var_dump($e->getMessage());
}
方法四:
设置php.ini获取错误日志
log_errors = On
error_log = C:\Users\zhtfi\Desktop\error_php.log