PHP: [Bug] 如果只有 "error_reporting" 可以隐藏或显示错误,为什么 "display_errors" 存在?
PHP: [Bug] Why does "display_errors" exist if only "error_reporting" can hide or show errors?
EDIT: My Environment is the following (this is relevant to the
answer):
- Microsoft IIS 10.0 Express
- Windows 7 Professional SP1
- PHP Version 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"];
当我 运行 此代码时,我看到以下错误消息(这是图像的 link,因为我没有足够的声誉来 post 它在这里):
http://i.imgur.com/mupV8BO.png
PHP:第 9 行生成的错误消息应该对用户隐藏。如果什么都不做,为什么 "display_errors" 存在?
是的,PHP 错误及其配置可能看起来 有点 如果不熟悉内部工作原理的话真的很奇怪。发生了很多事情。
display_errors
- 控制 PHP 的默认错误处理程序是否在错误发生时将错误打印到输出
error_reporting
抑制的错误代码不会打印
- 控制 PHP 的默认异常处理程序是否将未捕获的异常打印到输出
log_errors
error_reporting
- 为应该报告的错误定义一个全局掩码
- 此选项由 PHP 的默认错误处理程序使用(见上文)
- custom error handler 也应该使用此选项
set_error_handler()
- 定义自定义错误处理程序
- 如果发生错误(即使它被抑制)总是被调用
- 如果 returns
false
,将调用 PHP 的默认错误处理程序(并根据设置打印/记录错误)
- 如果它 returns
null
或 true
或抛出异常,PHP 的默认错误处理程序将不会被调用(因此它不会打印/记录任何内容)。
set_exception_handler()
- 定义自定义异常处理程序
如果定义了自定义处理程序,- PHP 的默认异常处理程序将不会被调用(因此它不会打印/记录任何内容)
But, why even bother with "display_errors = 'Off'" when it does not have an effect anyway?
以上设置的组合使得display_errors
并非毫无用处。
示例:
display_errors
必须 在生产服务器上 php.ini 中 off
以防止泄漏可能是敏感数据
- 在您有机会更改任何其他设置之前可能会发生错误/异常
- 如果您想记录错误但不将它们打印到输出中,请将
display_errors
设置为 off
并将 log_errors
设置为 on
- 如果您正在使用打印自定义错误消息的自定义错误处理程序,但您还想使用
error_log
,请将 display_errors
设置为 off
经过反复试验并使用 ShiraNai7 的解释,我发现这是 Microsoft IIS 和 FastCGI PHP 中的错误。请参阅 link 错误:
Bug #44729 display_errors = 关闭不被尊重
EDIT: My Environment is the following (this is relevant to the answer):
- Microsoft IIS 10.0 Express
- Windows 7 Professional SP1
- PHP Version 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"];
当我 运行 此代码时,我看到以下错误消息(这是图像的 link,因为我没有足够的声誉来 post 它在这里):
http://i.imgur.com/mupV8BO.png
PHP:第 9 行生成的错误消息应该对用户隐藏。如果什么都不做,为什么 "display_errors" 存在?
是的,PHP 错误及其配置可能看起来 有点 如果不熟悉内部工作原理的话真的很奇怪。发生了很多事情。
display_errors
- 控制 PHP 的默认错误处理程序是否在错误发生时将错误打印到输出
error_reporting
抑制的错误代码不会打印
- 控制 PHP 的默认异常处理程序是否将未捕获的异常打印到输出
log_errors
error_reporting
- 为应该报告的错误定义一个全局掩码
- 此选项由 PHP 的默认错误处理程序使用(见上文)
- custom error handler 也应该使用此选项
set_error_handler()
- 定义自定义错误处理程序
- 如果发生错误(即使它被抑制)总是被调用
- 如果 returns
false
,将调用 PHP 的默认错误处理程序(并根据设置打印/记录错误) - 如果它 returns
null
或true
或抛出异常,PHP 的默认错误处理程序将不会被调用(因此它不会打印/记录任何内容)。
set_exception_handler()
- 定义自定义异常处理程序 如果定义了自定义处理程序,
- PHP 的默认异常处理程序将不会被调用(因此它不会打印/记录任何内容)
But, why even bother with "display_errors = 'Off'" when it does not have an effect anyway?
以上设置的组合使得display_errors
并非毫无用处。
示例:
display_errors
必须 在生产服务器上 php.ini 中off
以防止泄漏可能是敏感数据- 在您有机会更改任何其他设置之前可能会发生错误/异常
- 如果您想记录错误但不将它们打印到输出中,请将
display_errors
设置为off
并将log_errors
设置为on
- 如果您正在使用打印自定义错误消息的自定义错误处理程序,但您还想使用
error_log
,请将display_errors
设置为off
经过反复试验并使用 ShiraNai7 的解释,我发现这是 Microsoft IIS 和 FastCGI PHP 中的错误。请参阅 link 错误:
Bug #44729 display_errors = 关闭不被尊重