美文网首页
深入理解php的错误提示设置

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

作者: 大林_达令 | 来源:发表于2020-05-03 15:13 被阅读0次

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

    相关文章

      网友评论

          本文标题:深入理解php的错误提示设置

          本文链接:https://www.haomeiwen.com/subject/oqclghtx.html