(独孤九剑)--错误处理
(1)错误处理概论
开发时显示错误能够帮助我们快速定位解决错误
但在生产环境(即公网)给他人访问的网站、微网站、手机站等,若显示错误则很容易暴露相关信息
①服务器文件路径及文件存储规范;②mysql数据库服务器地址
(2)禁止显示错误
①通过配置文件可以控制错误显示状态,(无法屏蔽语法错误)
php.int中有专门配置项:display_errors,默认为on打开,也可以设置为off关闭。或者可以设置为0或1。
关闭后不会在页面显示错误,但是有错误时会导致页面直接显示失败
②无法修改php.int时,使用int_set(),(无法屏蔽语法错误)
<?php int_set('display_errors',0); ?>
上面代码与关闭display_errors相同,但是仅仅在当前代码生效
<?php ini_set('display_errors', 0); echo $a;//这里$a未定义,但不会报错 ?>
③使用@屏蔽单条语句的错误(无法屏蔽语法错误)
④修改错误级别显示
php.ini的error_reporting这个是修改错误级别显示,如果将级别设为最高等级的,则什么错误都不会显示在php.ini中找到error_reporting,去掉前面的分号(如果有),并将值改为0
注意:这种方法会屏蔽所有错误,未定义、语法等
(3)获取php.int配置项状态
ini_get()函数获取配置项状态,例如
<?php echo ini_get('display_errors');//输出1,此时会报错 ini_set('display_errors', 0);//配置当前文件的报错 echo ini_get('display_errors');//输出0,此时不会报错 ?>
(4)错误报告级别(错误类型)
常用的有三种
①语法错误E_ERROR
这种错误是最为严重的,文件直接中断。只能改代码来解决,且一般屏蔽错误的语法无法屏蔽该级别的错误(error_reporting修改错误级别显示外)
②警告错误E_WARNING
问题较为严重,但还会向下执行。可以通过@符来屏蔽
③注意错误E_NOTICE
问题较轻,不会影响程序执行。常发生在项目未定义
其他错误:
不常见,且一般不会提示
①语法解析错误E_PARSE
编译时语法解析错误,仅仅由分析器产生
②所有错误E_ALL
(5)错误报告
error_reporting参数--报告错误类型,决定PHP引擎记录、报告、显示错误类型
若error_reporting设置为0,则整个PHP引擎错误均不会显示、输出、记录。包括语法错误、警告错误、提示错误等
也不会记录到日志里
①显示所有错误error_reporting = E_ALL;
②显示所有错误但排除提示error_reporting = E_ALL & ~ E_NOTICE;
③显示所有错误但排除提示error_reporting = E_ALL & ~ E_NOTICE ~ E_STRICT ~ E_DEPRECATED
但是,无权操作php.int文件,又想要控制错误报告怎么办?
这时可以用error_reporting()函数来控制,注意这里虽然可以控制,但和php.int里相比,无法屏蔽语法错误
(6)错误记录日志
①不让用户看到的情况下,将错误收集到日志系统。需要用到php.int的相关配置项
log_errors 是否开启日志记录(on开启,off关闭)
log_errors_max_len 单行错误最大记录长度(整型,默认1024)
error_log 错误日志存储路径(syslog或者指定路径)
配置项里的syslog指系统记录,windows系统在电脑的日志收集器里记录,而Linux系统则默认在:/etc/syslog.conf系统目录下
②查看是否开启(0为关闭,1为开启)
<?php echo ini_get('log_errors'); ?>
③动态设置开关
<?php ini_set('log_errors', 0); echo ini_get('log_errors');//设置了关闭,所以会输出0 ?>
④自定义错误日志函数
error_log( 错误消息,[错误消息类型],[存储目标] )
该函数可以把错误信息发送到WEB服务器的错误日志,或者到一个文件里。
常用的错误类型:
0 发送至默认的error_log指定位置(默认)
1 发送到指定的邮件位置
3 发送到指定的文件位置(追加模式,常用项)
<?php //无法连接到数据库服务器,直接记录到php.int的error_log指定位置 error_log("无法连接到数据库服务器"); //可以发送邮件,但php.int必须配置过邮件系统 error_log("邮件发送报告错误,及时维修",'pig@php.cn'); //记录到指定位置 error_log("我是一个错误",3,"./error.log"); ?>
(7)自定义错误处理函数
常用到的两个函数:
set_error_handler(回调错误处理函数),主要用来设置一个用户自定义的错误处理函数
trigger_error(错误信息),用来产生用户级别的错误提示信息
<?php //自定义错误处理函数 function customError($errno,$errstr,$errfile,$errline){ //输出错误消息 echo "错误消息[$errno]:$errstr<br>"; //输出错误行 echo "错误行$errline in $errfile"; //终止运行 exit(); } //使用set_error_handler绑定用户自定义函数 set_error_handler('customError'); $test = 2; //触发自定义错误trigger_error if($test > 1){ trigger_error("自定义错误"); } ?>