为什么PHP错误打印两次?

问题描述 投票:28回答:2

摘要

令人惊讶的是,我在Google或SO上找不到任何相关信息。当我在PHP中引发异常时,它会在控制台中出现两次,并附有错误消息和堆栈跟踪。第一次打印时显示“ PHP致命错误:...”,第二次显示“致命错误:...”。我尚未测试这是Apache插件版本。

示例

为了安全起见,某些名称空间和路径用'...'缩写:

$ php code / com /.../ tabular_data.phpPHP致命错误:/home/codemonkey/.../tabular_data.php:56中未捕获的异常“ Exception”,消息为“文件类型不受支持”堆栈跟踪:#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}在第56行的/home/codemonkey/.../tabular_data.php中抛出致命错误:/home/codemonkey/.../tabular_data.php:56中未捕获的异常“ Exception”,消息为“文件类型不受支持”堆栈跟踪:#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}在第56行的/home/codemonkey/.../tabular_data.php中抛出

问题

我假设它与stderr和stdout都有关系,都可以打印错误。无论如何,我怎样才能很好地要求PHP仅打印一次,最好打印到stderr?


版本输出

PHP 5.3.9(cli)(内置:2012年1月11日17:09:48)版权所有(c)1997-2012 The PHP GroupZend Engine v2.3.0,版权所有(c)1998-2012 Zend Technologies

代码

http://pastebin.com/iBUGJ2eY这是确切的代码,它为我显示了双重异常,并将名称空间和路径编辑为foos。请注意,在此安装中,我总是会在命令行中遇到双重异常。我几乎可以肯定,问题出在PHP配置中。

php php-ini
2个回答
37
投票

得到它的复制。第一条错误消息是log_errors设置的结果,然后转到STDERR

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

这两个设置都可以在运行时更改。因此,为了“很好地询问PHP”,满足以下条件:

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

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。

© www.soinside.com 2019 - 2024. All rights reserved.