0

编辑:我的环境如下(这与答案有关):

  • 微软 IIS 10.0 速成版
  • 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"];

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

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

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

4

2 回答 2

2

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

错误 #44729 display_errors = Off 不被尊重

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

于 2016-05-24T21:19:43.423 回答
1

是的,PHP 错误及其配置可能看起来一点点如果一个人不熟悉内部运作,那真的很奇怪。有很多事情发生。

display_errors

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

log_errors

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

error_reporting

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

set_error_handler()

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

set_exception_handler()

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

但是,既然“display_errors = 'Off'”无论如何都没有效果,为什么还要打扰它呢?

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

例子:

  • display_errors 必须off在生产服务器上的php.ini中,以防止泄露可能的敏感数据
    • 在您有机会更改任何其他设置之前,可能会发生错误/异常
  • 如果您想记录错误但不将它们打印到输出,则设置display_errorsofflog_errorson
  • 如果您正在使用打印自定义错误消息的自定义错误处理程序,但您也想使用error_log,则设置display_errorsoff
于 2016-05-24T16:53:32.730 回答