一、PHP的错误分类
1.语法错误
语法错误不会执行PHP脚本文件中的任意代码
2.运行时错误
在代码执行的过程当中发生的错误
3.逻辑错误
不会发生语法错误,不会发生运行时错误,会显示错误的结果
通常情况下,这种错误最难排错
二、错误报错级别
级别常量 错误值 错误报告描述
E_ERROR 1 致命的运行时错误(阻止脚本执行)
E_WARNING 2 运行时警告(非致命性错误)
E_PARSE 4 从语法中解析错误
E_NOTICE 8 运行时注意消息(可能是或可能不是一个问题)
E_CORE_ERROR 16 PHP启动时初始化过程中的致命错误
E_CORE_WARNING 32 PHP启动时初始化过程中的警告(非致命性)
E_COMPILE_ERROR 64 编译时致命错误
E_COMPILE_WARNING 128 编译时警告(非致命性)
E_USER_ERROR 256 用户自定义的致命错误
E_USER_WARNING 512 用户自定义的警告
E_USER_NOTICE 1024 用户自定义的提醒(经常是bug)
E_STRICT 2048 编码标准化警告(建议如何修改以向前兼容)
E_ALL 6143 所有的错误、警告和注意信息
三、更改错误报告级别
1.PHP的配置文件php.ini中:
display_errors=On/Off (是否显示错误报告)
error_reporting=E_ALL (更改要显示的错误报告级别)
2.在代码中修改:
ini_set('display_errors','off');
error_reporting(0); / error_reporting(E_ALL);
四、用户自定义错误报告的处理方式
①trigger_error('提示信息',E_USER_ERROR/WARNING/NOTICE);
②set_error_handler(回调函数):
回调函数所需的参数:
errorno:错误报告级别的常量值
errorstr:错误信息
errorfile:错误发生的文件
errorline:错误发生的行号
注意:当前文件每发生一次错误,都会调用一次该回调函数
例:
set_error_handler('myerror');
function myerror($errorno,$errorstr,$errorfile,$errorline){
}
set_error_handler('myerrors'); function myerrors($errorno,$errorstr,$errorfile,$errorline){ switch ($errorno) { case 1: $str='致命错误'; break; case 2: $str='警告错误'; break; case 4: $str='解析错误'; break; case 8: $str='注意'; break; } $str.=':'.$errorstr; $str.="<br>发生在文件:".$errorfile."的第".$errorline."行"; echo "<div style='400px;height:100px;border:1px dashed gray;overflow:auto;padding:10px;position:fixed;right:10px;bottom:10px;'>{$str}</div>"; }
五、保存错误日志到指定文件中
代码中设置:
ini_set('error_reporting','E_ALL'); //不可关闭错误报告级别,否则系统的错误报告不会写入日志文件
ini_set('display_errors','off'); //关闭以避免系统错误报告在界面的显示
ini_set('log_errors','on'); //开启外部保存错误信息
ini_set('error_log','D:/error.log'); //设置保存的位置
//代码中使用函数error_log()即可将错误信息写入到D:/error.log文件中
//也可在set_error_handler()的回调函数中使用函数error_log()
error_log('自定义错误信息');
例:
error_log("IP地址为:".$_SERVER['REMOTE_ADDR']."的主机在时间:".date('Y-m-d H:i:s')."以用户名:".$username.",密码:".$password."尝试登录");