问题
Summary
Amazingly I could find nothing about this on Google or SO. When I throw an exception in PHP it appears in my console twice, complete with error message and stack trace. The first time it's printed it says "PHP Fatal error: ..." and the second time it just says "Fatal error: ...". I haven't tested this is the Apache plugin version.
Example
With some namespaces and paths shortened with '...' for safety:
$ 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
Question
I assume it has something to do with stderr and stdout both printing the error. In any case how do I ask PHP nicely to only print it once, preferably to stderr?
Version output
PHP 5.3.9 (cli) (built: Jan 11 2012 17:09:48)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
The code
http://pastebin.com/iBUGJ2eY
This is the exact code that displays double exceptions for me, with namespaces and paths edited to foos. Note that I always get double exceptions in the command line on this installation. I'm all but certain that the issue lies in the PHP configuration.
回答1:
Got it reproduced. The first error message is a result of the log_errors
setting and goes to STDERR
.
The second is a result of display_errors
and goes to STDOUT
.
Both settings can be altered during runtime. So in order to "ask PHP nicely", this suffices:
ini_set('log_errors', 1);
ini_set('display_errors', 0);
回答2:
Like written in the answer of Linus Kleen the reason for the double messages is that the display_errors
go to stdout.
I found out that since php 5.2.4 this even happens when display_errors
is set to 1 or "on".
To restore the normal behavoir it is the best way to define file where logged errors should be stored e.g. add this:
error_log = 'd:/logs/php_error.log'
to your php.ini.
When the file for error_log is defined, you get only one message to stdout what you would need for testing.
And for production state you can set display_errors
to 0.
来源:https://stackoverflow.com/questions/9001911/why-are-php-errors-printed-twice