深入理解php的错误提示设置

2020-05-03  本文已影响0人  大林_达令

php使用error_reporting函数设置错误提示,这个很多人知道,但是发现很多人不是很理解具体设置的问题,有时候设置了error_reporting(0),还是会出现报错提示,有时候设置成error_reporting(E_ALL)则反而不显示错误提示。下面我来详细讲解下php的错误提示设置。
php主要是由以下几个函数控制报错的

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里面的错误级别

一般来说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控制错误提示是否显示并且具体显示什么级别的错误。

上一篇下一篇

猜你喜欢

热点阅读