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

PHP: [Bug] Why does "display_errors" exist if only "error_reporting" can hide or show errors?

EDIT: My Environment is the following (this is relevant to the answer):

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

我想弄清楚设置 "display_errors" 的目的是什么。 在下面的代码中,我试图 隐藏第 9 行抛出的 PHP 通知 。很自然地,人们会认为只需设置

 display_errors = 'Off'

会完成这个,但似乎没有效果。

我的理解是 "error_reporting" 让您选择 捕获哪些 错误,并且 "display_errors" 决定是否将错误消息回显到用户。我错了吗?在我的大多数 Google 搜索中,我看到人们设置 both

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"];

当我 运行 此代码时,我看到以下错误消息(这是图像的 link,因为我没有足够的声誉来 post 它在这里):

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

PHP:第 9 行生成的错误消息应该对用户隐藏。如果什么都不做,为什么 "display_errors" 存在?

是的,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()

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

set_exception_handler()

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

But, why even bother with "display_errors = 'Off'" when it does not have an effect anyway?

以上设置的组合使得display_errors并非毫无用处。

示例:

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

经过反复试验并使用 ShiraNai7 的解释,我发现这是 Microsoft IIS 和 FastCGI PHP 中的错误。请参阅 link 错误:

Bug #44729 display_errors = 关闭不被尊重

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