提问人:user3163495 提问时间:5/25/2016 最后编辑:user3163495 更新时间:6/14/2019 访问量:462
PHP:[Bug] 如果只有“error_reporting”可以隐藏或显示错误,为什么“display_errors”存在?
PHP: [Bug] Why does "display_errors" exist if only "error_reporting" can hide or show errors?
问:
编辑:我的环境如下(这与 回答):
- 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”什么都不做,为什么它存在?
答:
1赞
Shira
5/25/2016
#1
是的,如果不熟悉内部工作原理,PHP错误及其配置可能看起来有点奇怪。发生了很多事情。
display_errors
- 控制 PHP 的默认错误处理程序是否在错误发生时将错误打印到输出中
- 错误代码被 suppresed by 不会打印
error_reporting
- 错误代码被 suppresed by 不会打印
- 控制 PHP 的默认异常处理程序是否将未捕获的异常打印到输出中
log_errors
error_reporting
- 定义应报告错误的全局掩码
- 此选项由 PHP 的默认错误处理程序使用(见上文)
- 自定义错误处理程序也应使用此选项
set_error_handler()
- 定义自定义错误处理程序
- 如果发生错误(即使它被抑制),则始终调用它
- 如果返回,将调用 PHP 的默认错误处理程序(并根据设置打印/记录错误)
false
- 如果它返回或抛出异常,PHP 的默认错误处理程序将不会被调用(因此它不会打印/记录任何内容)。
null
true
set_exception_handler()
- 定义自定义异常处理程序
- 如果定义了自定义处理程序,则不会调用 PHP 的默认异常处理程序(因此它不会打印/记录任何内容)
但是,当它无论如何都没有效果时,为什么还要为“display_errors = '关闭'”而烦恼呢?
上述设置的组合并非毫无用处。display_errors
例子:
display_errors
必须在生产服务器上php.ini,以防止泄露可能的敏感数据off
- 在您有机会更改任何其他设置之前,可能会发生错误/异常
- 如果要记录错误但不将其打印到输出中,请将 设置为 和
display_errors
off
log_errors
on
- 如果使用的是打印自定义错误消息的自定义错误处理程序,但还想使用 ,请设置为
error_log
display_errors
off
评论
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 = 关闭 不尊重
评论