PHP:php错误/警告/通知的双重输出

Posted

技术标签:

【中文标题】PHP:php错误/警告/通知的双重输出【英文标题】:PHP: double output of php errors / warnings / notices 【发布时间】:2014-05-12 11:42:48 【问题描述】:

如果我执行以下脚本:

<?php
error_reporting(E_ALL);
trigger_error('test notice', E_USER_NOTICE);
die('end of script');

我得到以下输出:

<br />
<b>Notice</b>:  test notice in <b>path/to/script/test.php</b> on line <b>3</b><br />
end of scriptPHP Notice:  test notice in path/to/script/test.php on line 3

脚本是在 IIS8 上使用 PHP 版本 5.4.19 执行的。

返回的http状态码是200。

php.ini 文件中的“display_errors”设置为“On”,“error_reporting”设置为“E_ALL”。所以脚本的第一行只是为了澄清。

所有错误报告常量(E_ERROR、E_WARNING 等)的行为都相同。

有谁知道通知的第二个输出来自哪里?尤其是如何摆脱它?

【问题讨论】:

脚本开启php脚本的错误报告。有关错误,请参阅第 3 行的文件 test.php 不知道 IIS 但命令行 PHP 将错误消息打印到 stdout 和 stderr。您的网络服务器设置似乎也是如此。 你试过评论第一行error_reporting(E_ALL); 是的,我试图将其注释掉。但是 error_reporting 函数只定义了哪些错误类型(级别)将被输出,而不是如果它们真的作为输出发送。 display_errors 指令定义了这一点。 【参考方案1】:

如果你同时设置了

error_reporting(E_ALL);
ini_set('display_errors', 1);

错误会加倍:

PHP 注意:未定义变量:test in /path/to/script.php 8号线

注意:未定义的变量:test in /path/to/script.php 8号线

尝试关闭其中一个或另一个或set a custom error handler。

【讨论】:

【参考方案2】:

脚本的第一行

error_reporting(E_ALL);
将 PHP 设置为报告所有错误,并在您的 PHP 配置中启用 display_errors 指令,该指令将 PHP 设置为打印错误屏幕,则无需复制输出的第二行。

【讨论】:

抱歉,这不是真的。 “error_reporting()”函数不输出任何内容,它只是覆盖了 php.ini 中设置的“error_reporting”指令。并且不会导致第二次输出。【参考方案3】:

为了解决这个问题,我必须在 IIS 中更改站点的基本设置: “连接为”与 IIS_USER 和 php 错误消息的双重输出消失了! 我仍然不知道为什么,但至少它有效。

【讨论】:

以上是关于PHP:php错误/警告/通知的双重输出的主要内容,如果未能解决你的问题,请参考以下文章

禁用部分页面php的警告和通知

如何在 .htaccess 文件中禁用 PHP 中的通知和警告?

PHP中的错误处理机制

PHP 退出并出现“双重释放或损坏”错误

获取 PHP 错误警告:fputcsv() 期望参数 2 为数组

PHP中的错误信息