PHP:[错误]为什么" display_errors"只有" error_reporting"才存在可以隐藏或显示错误?

时间:2016-05-24 16:35:30

标签: php error-reporting ini-set

  

编辑:我的环境如下(这与以下内容相关)   回答):

     
      
  • Microsoft IIS 10.0 Express
  •   
  • Windows 7 Professional SP1
  •   
  • PHP版本5.6.16 x86 FastCGI
  •   

我试图找出设置的目的" display_errors"具有。 在下面的代码中,我试图隐藏在第9行引发的PHP Notice 。当然,人们会认为只需设置

 display_errors = 'Off'

会做到这一点,但似乎没有效果。

我理解" error_reporting"允许您选择捕获哪些错误,以及" display_errors"确定错误消息是否回显给用户。我错了吗?在我的大多数Google搜索中,我看到人们设置两者

error_reporting = 0

display_errors = 'Off'

但是,为什么甚至打扰

   display_errors = 'Off'

什么时候没有效果?

我的测试代码:

<?php
//ini_set("error_reporting", 0);
ini_set("display_errors", "Off");
ini_set("display_startup_errors", "Off");
date_default_timezone_set("America/Chicago");

echo "Hey<br />";

echo $myarr["hey"];

当我运行此代码时,我看到以下错误消息(这是图像的链接,因为我没有足够的声誉在此处发布):

http://i.imgur.com/mupV8BO.png

PHP:应该向用户隐藏为第9行生成的错误消息。为什么&#34; display_errors&#34;如果它什么都不做就存在?

2 个答案:

答案 0 :(得分:2)

经过反复试验并使用ShiraNai7的解释后,我发现这是PHP在Microsoft IIS和FastCGI上的一个错误。请参阅错误链接:

错误#44729 display_errors =关闭不受尊重

https://bugs.php.net/bug.php?id=44729

答案 1 :(得分:1)

是的,如果一个人不熟悉内部工作原理,那么PHP错误及其配置可能看起来有点非常奇怪。有很多事情要发生。

display_errors

  • 控制PHP的默认错误处理程序是否在输出时将错误输出到输出
    • error_reporting支持的错误代码将不会打印
  • 控制PHP的默认异常处理程序是否将未捕获的异常打印到输出

log_errors

  • 控制PHP的默认错误处理程序是否将错误记录到error_log
    • error_reporting取消的错误代码将不会记录
  • 控制PHP的默认异常处理程序是否将例外记录到error_log

error_reporting

  • 为应报告的错误定义全局掩码
  • 此选项由PHP的默认错误处理程序(见上文)
  • 使用
  • 此选项也应由custom error handler
  • 使用

set_error_handler()

  • 定义了自定义错误处理程序
  • 如果发生错误(即使它被抑制),它总是被调用
  • 如果返回false,将调用PHP的默认错误处理程序(并根据设置打印/记录错误)
  • 如果它返回nulltrue或抛出异常,则不会调用PHP的默认错误处理程序(因此它不会打印/记录任何内容)。

set_exception_handler()

  • 定义了一个自定义异常处理程序
  • 如果定义了自定义处理程序,则不会调用PHP的默认异常处理程序(因此它不会打印/记录任何内容)
  

但是,为什么甚至打扰&#34; display_errors =&#39; Off&#39;&#34;什么时候它没有效果?

上述设置的组合使display_errors毫无用处。

示例:

  • display_errors 必须在生产服务器上的 php.ini off,以防止泄露可能敏感的数据
    • 在您有机会更改任何其他设置之前可能会发生错误/异常
  • 如果您想记录错误但不将其打印到输出中,请将display_errors设置为off,将log_errors设置为on
  • 如果您使用自定义错误处理程序打印自定义错误消息但您还想使用error_log,则将display_errors设置为off