为什么PHP错误打印两次?

时间:2012-01-25 11:26:45

标签: php php-ini

摘要

令人惊讶的是,我无法在Google或SO上找到任何相关信息。当我在PHP中抛出异常时,它会在我的控制台中出现两次,完成错误消息和堆栈跟踪。它第一次打印出来时说“PHP Fatal error:...”,第二次它只是说“致命错误:......”。我没有测试过这是Apache插件版本。

实施例

为了安全起见,将一些名称空间和路径缩短为“...”:

$ php code/com/.../tabular_data.php
PHP Fatal error:  Uncaught exception 'Exception' with message 'File type not supported' in /home/codemonkey/.../tabular_data.php:56
Stack trace:
#0 /home/codemonkey/.../tabular_data.php(88): com\...\Tabular_Data->loadFromFile('/home/codemonke...', false)
#1 /home/codemonkey/.../tabular_data.php(95): com\...\Tabular_Data::fromFile('/home/codemonke...')
#2 {main}
  thrown in /home/codemonkey/.../tabular_data.php on line 56

Fatal error: Uncaught exception 'Exception' with message 'File type not supported' in /home/codemonkey/.../tabular_data.php:56
Stack trace:
#0 /home/codemonkey/.../tabular_data.php(88): com\...\Tabular_Data->loadFromFile('/home/codemonke...', false)
#1 /home/codemonkey/.../tabular_data.php(95): com\...\Tabular_Data::fromFile('/home/codemonke...')
#2 {main}
  thrown in /home/codemonkey/.../tabular_data.php on line 56

问题

我认为它与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
这是为我显示双重例外的确切代码,命名空间和路径编辑为foos。请注意,我总是在此安装的命令行中获得双重例外。我几乎可以肯定,问题在于PHP配置。

2 个答案:

答案 0 :(得分:36)

得到了转载。第一条错误消息是log_errors设置的结果,并转到STDERR

第二个是display_errors的结果,然后转到STDOUT

两个设置都可以在运行时更改。所以为了“很好地问问PHP”,这就足够了:

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

答案 1 :(得分:0)

就像用answer of Linus Kleen写的一样,出现双重消息的原因是display_errors进入标准输出。 我发现自php 5.2.4起,甚至在display_errors设置为1或“ on”时也会发生这种情况。

要恢复正常的行为,这是定义应存储记录的错误的文件的最佳方法,例如添加此:

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

到您的php.ini。 定义了error_log的文件后,您仅会收到一条消息,提示您需要测试什么。 对于生产状态,您可以将display_errors设置为0。