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

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

提问人:user3163495 提问时间:5/25/2016 最后编辑:user3163495 更新时间:6/14/2019 访问量:462

问:

编辑:我的环境如下(这与 回答):

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

我试图弄清楚设置“display_errors”有什么目的。 在下面的代码中,我试图隐藏在第 9 行抛出的 PHP 通知。自然有人会认为,简单地设置

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

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

https://i.stack.imgur.com/qB6Au.png

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

php 错误报告 ini-set

评论

0赞 Jason K 5/25/2016
error_reporting 是一个函数,而不是一个变量。error_reporting(0);应关闭所有错误。 php.net/manual/en/function.error-reporting.php
0赞 user3163495 5/25/2016
可以使用ini_set修改@JasonK error_reporting。它位于您链接的 PHP 手册页的“示例”部分
0赞 Abdulla Nilam 5/25/2016
为什么你不隐藏它就修复了那些!
0赞 Abdulla Nilam 5/25/2016
修复这些错误。所以你没有必要隐藏这些。它最好
0赞 user3163495 5/25/2016
@Abdulla 我故意把错误放在我发布的代码中,以便更好地理解PHP错误处理机制。此外,它的重点是向您(开发人员)尚未捕获的用户隐藏未知错误

答:

1赞 Shira 5/25/2016 #1

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

display_errors

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

log_errors

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

error_reporting

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

set_error_handler()

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

set_exception_handler()

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

但是,当它无论如何都没有效果时,为什么还要为“display_errors = '关闭'”而烦恼呢?

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

例子:

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

评论

0赞 user3163495 5/25/2016
对不起,我的迟钝......我仍然试图把我的头包起来。你能给我看一个简短的例子(在代码中)其中“display_errors = 关闭”会对错误输出产生影响吗?
0赞 Charlotte Dunois 5/25/2016
如果未禁止显示类型,则 Iirc 会将错误直接输出为输出的一部分。因此,应在生产中将其设置为“关闭”。display_errors
0赞 Shira 5/25/2016
@user3163495我在答案中添加了更多信息,并提供了有效果的示例案例。display_errors
0赞 user3163495 5/25/2016
你@ShiraNai7尝试过测试我发布的代码吗?我的例子与你的陈述相矛盾“如果你想记录错误但不将它们打印到输出中,你display_errors设置为关闭”
1赞 user3163495 5/25/2016
@ShiraNai7 原来这是一个错误 ShiraNai7
2赞 user3163495 5/25/2016 #2

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

错误 #44729 display_errors = 关闭 不尊重

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