深入理解php的错误提示设置
php使用error_reporting函数设置错误提示,这个很多人知道,但是发现很多人不是很理解具体设置的问题,有时候设置了error_reporting(0),还是会出现报错提示,有时候设置成error_reporting(E_ALL)则反而不显示错误提示。下面我来详细讲解下php的错误提示设置。
php主要是由以下几个函数控制报错的
-
display_errors
开启状态下,若出现错误,则报错,出现错误提示
关闭状态下,若出现错误,则提示:服务器错误。但是不会出现错误提示 -
log_errors
设置是否开启错误日志记录 -
error_reporting
error_reporting = E_ALL & ~E_NOTICE 用于设置错误提示级别
所以说要开启错误提示,首先得开启display_errors,error_reporting仅仅是用于设置错误提示级别得。
ini_set('display_errors','On');
error_reporting(E_ALL);
echo $a;
Notice: Undefined variable: a in /home/www/tp5/public/index.php on line 4
例如上面代码,由于$a未定义所以报了个notice错误
ini_set('display_errors','Off');
error_reporting(E_ALL);
echo $a;
例子中关闭了错误提示所以error_reporting设置不起作用
ini_set('display_errors','Off');
error_reporting(0);
echo $a
Parse error: syntax error, unexpected end of file, expecting ',' or ';' in /home/www/tp5/public/index.php on line 30
上述例子我故意把最后一行的分号去掉,提示parse error错误了。奇怪,为什么明明关闭了错误提示还是会报错?
要理解这个问题首先我们先看下PHP里面的错误级别
- Deprecated最低级别错误,程序继续执行,一般是低版本函数的预提示错误
- Notice 通知级别的错误 如直接使用未声明变量,程序继续执行
- Warning 警告级别的错误,可能得不到想要的结果
- Fatal error 致命级别错误致命级别错误,程序不往下执行
- parse error 语法解析错误,最高级别错误,连其他错误信息也不呈现出来
- E_USER_相关错误 用户设置的相关错误
一般来说parse error 是最致命的,翻译成中文就是语法错误。parse error的报错是在PHP解析的过程中已经报错,其他的报错都是php解析完成之后报错。所以就是说parse error报错会导致php解析失败,文件没有执行到,自然其他错误也不会呈现出来。但是却会报parse error错误,但是整个错误并发PHP执行的时候的错误,是解析的时候的错误。那是不是说display_errors对parse error这个级别得报错不起作用呢?非也。display_errors是可以控制所有报错的显示的,但是你这个display_errors是在php里面作用,也就是解析之后才作用。也就是仅仅是局部作用。要想全局作用的话就要在php.ini文件里面设置
display_errors = On
改成display_errors = Off
.
重启php服务
这时候你打印phpinfo你会看到display_errors对应的Master Value已经改成off说明全局设置已经生效。
这时候你再运行上面的代码你会发现报错提示不见了,取而代之的是返回500的服务器错误。也就是说局部作用只是作用在php解析之后运行的文件里面,而全局master value是作用在php整个解析运行过程中。
再举个例子,有时候开发的时候由于你配置文件里面的display_errors处于关闭状态,但是你在php里面开启了display_errors没有报错
ini_set('display_errors','on');
error_reporting(E_ALL);
echo 1
也是因为由于语法错误导致PHP文件解析失败,文件根本就没有执行到,所有肯定是不报错。那你就只能去修改配置文件的display_error
总结:线上环境可以关闭display_error全局配置,防止错误信息泄露。开发环境使用局部配置搭配error_reporting控制错误提示是否显示并且具体显示什么级别的错误。