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的默认错误处理程序(并根据设置打印/记录错误) 如果它返回 nulltrue 或抛出异常,则不会调用 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”会对错误输出产生影响? Iirc display_errors 如果没有抑制类型,则直接将错误作为输出的一部分输出。因此,应该在生产中将其设置为 Off。 @user3163495 我在答案中添加了更多信息,并提供了display_errors 有效的示例。 @ShiraNai7 你试过测试我发布的代码吗?我的示例与您的陈述相矛盾“如果您想记录错误但不将它们打印到输出,您将 display_errors 设置为关闭” @ShiraNai7 这原来是一个错误 ShiraNai7

以上是关于PHP:[Bug] 如果只有“error_reporting”可以隐藏或显示错误,为啥还存在“display_errors”?的主要内容,如果未能解决你的问题,请参考以下文章

BUUCTF[NPUCTF2020] web 部分WP

PHP运行出现Notice

error_reporting - PHP

php redis2.2.7扩展bug导致段故障与重新声明类bug

PHP变量解析顺序variables_order

php curl的隐藏BUG