PHP:[Bug] 如果只有“error_reporting”可以隐藏或显示错误,为啥还存在“display_errors”?
Posted
技术标签:
【中文标题】PHP:[Bug] 如果只有“error_reporting”可以隐藏或显示错误,为啥还存在“display_errors”?【英文标题】:PHP: [Bug] Why does "display_errors" exist if only "error_reporting" can hide or show errors?PHP:[Bug] 如果只有“error_reporting”可以隐藏或显示错误,为什么还存在“display_errors”? 【发布时间】:2016-09-22 00:05:36 【问题描述】:编辑:我的环境如下(这与 答案):
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 搜索中,我看到有人设置 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"];
当我运行此代码时,我看到以下错误消息(这是图片的链接,因为我没有足够的声誉将其发布在此处):
http://i.imgur.com/mupV8BO.png
PHP:为第 9 行生成的错误消息应该对用户隐藏。为什么“display_errors”不做任何事情还会存在?
【问题讨论】:
error_reporting 是一个函数而不是一个变量。错误报告(0);应该关闭所有错误。 php.net/manual/en/function.error-reporting.php @JasonK error_reporting 可以使用 ini_set 进行修改。它位于您链接的 PHP 手册页的“示例”部分中 为什么你没有隐藏它就修复了那些!! 修复这些错误。所以你不需要隐藏这些。最好的 @Abdulla 我故意将错误放在我发布的代码中,以便我可以更好地理解 PHP 错误处理机制。此外,它的目的是向用户隐藏 unknown 错误,而您,开发人员,尚未发现 【参考方案1】:经过反复试验并使用 ShiraNai7 的解释,我发现这是 Microsoft IIS 和 FastCGI 上的 PHP 中的一个错误。请参阅错误链接:
错误 #44729 display_errors = 不考虑关闭
https://bugs.php.net/bug.php?id=44729
【讨论】:
【参考方案2】:是的,如果不熟悉内部工作原理,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的默认错误处理程序(并根据设置打印/记录错误)
如果它返回 null
或 true
或抛出异常,则不会调用 PHP 的默认错误处理程序(因此它不会打印/记录任何内容)。
set_exception_handler()
定义自定义异常处理程序
如果定义了自定义处理程序,则不会调用 PHP 的默认异常处理程序(因此它不会打印/记录任何内容)
但是,既然“display_errors = 'Off'”无论如何都没有效果,为什么还要费心呢?
以上设置的组合使display_errors
并非无用。
例子:
display_errors
必须在生产服务器上的 php.ini 中为 off
,以防止泄露可能的敏感数据
在您有机会更改任何其他设置之前,可能会发生错误/异常
如果您想记录错误但不将它们打印到输出,请将display_errors
设置为off
并将log_errors
设置为on
如果您正在使用打印自定义错误消息的自定义错误处理程序,但您还想使用error_log
,则将display_errors
设置为off
【讨论】:
抱歉我的迟钝...我仍在努力解决它。您能否给我看一个简短的示例(在代码中),其中“display_errors = Off”会对错误输出产生影响? Iircdisplay_errors
如果没有抑制类型,则直接将错误作为输出的一部分输出。因此,应该在生产中将其设置为 Off。
@user3163495 我在答案中添加了更多信息,并提供了display_errors
有效的示例。
@ShiraNai7 你试过测试我发布的代码吗?我的示例与您的陈述相矛盾“如果您想记录错误但不将它们打印到输出,您将 display_errors 设置为关闭”
@ShiraNai7 这原来是一个错误 ShiraNai7以上是关于PHP:[Bug] 如果只有“error_reporting”可以隐藏或显示错误,为啥还存在“display_errors”?的主要内容,如果未能解决你的问题,请参考以下文章