为什么PHP错误被打印两次


Why are PHP errors printed twice?

摘要

令人惊讶的是,我在谷歌或SO上找不到任何关于这方面的信息。当我在PHP中抛出异常时,它会出现在我的控制台中两次,并带有错误消息和堆栈跟踪。第一次打印时,上面写着"PHP致命错误:…",第二次只写着"致命错误:.."。我还没有测试过这是Apache插件版本。

示例

某些命名空间和路径用"…"缩短安全:

$php-code.com//tabular_data.phpPHP致命错误:/home/codemonkey/中出现未捕获的异常"exception",消息为"不支持文件类型"/tabula_data.php:56堆栈跟踪:#0/home/codemonkey//tabular_data.php(88):com''。。。''Tabular_Data->loadFromFile('/home/codemonke…',false)#1/home/codemonkey//tabular_data.php(95):com''。。。''Tabula_Data::fromFile('/home/codemonke…')#2{main}被抛出/home/codemonkey//第56行的tabula_data.php致命错误:/home/codemonkey/中出现未捕获的异常"exception",消息为"不支持文件类型"/tabula_data.php:56堆栈跟踪:#0/home/codemonkey//tabular_data.php(88):com''。。。''Tabular_Data->loadFromFile('/home/codemonke…',false)#1/home/codemonkey//tabular_data.php(95):com''。。。''Tabula_Data::fromFile('/home/codemonke…')#2{main}被抛出/home/codemonkey//第56行的tabula_data.php

问题

我认为这与stderr和stdout都打印错误有关。在任何情况下,我如何很好地要求PHP只打印一次,最好是打印到stderr?


版本输出

PHP 5.3.9(cli)(构建时间:2012年1月11日17:09:48)
版权所有(c)1997-2012 PHP集团
Zend Engine v2.3.0,版权所有(c)1998-2012 Zend Technologies

代码

http://pastebin.com/iBUGJ2eY
这正是为我显示双重异常的代码,名称空间和路径被编辑为foo。请注意,在这次安装中,我总是在命令行中得到双重异常。我几乎可以肯定问题出在PHP配置上。

复制了它。第一个错误消息是log_errors设置的结果,并且进入STDERR

第二个是display_errors的结果,并且进入STDOUT

这两种设置都可以在运行时更改。因此,为了"很好地询问PHP",这就足够了:

ini_set('log_errors', 1);
ini_set('display_errors', 0);

正如Linus Kleen的回答中所写的那样,双消息的原因是display_errors进入stdout。我发现,由于php 5.2.4,当display_errors设置为1或"on"时,甚至会发生这种情况。

要恢复正常行为,最好的方法是定义应存储记录错误的文件,例如添加以下内容:

error_log = 'd:/logs/php_error.log'

到php.ini。当定义error_log的文件时,您只会得到一条到stdout的消息,这是您测试所需要的。对于生产状态,可以将display_errors设置为0。