Подтвердить что ты не робот

Почему ошибки PHP печатаются дважды?

Резюме

Удивительно, что я ничего не мог найти об этом в Google или SO. Когда я бросаю исключение в PHP, он появляется в моей консоли дважды, заполняя сообщение об ошибке и трассировку стека. В первый раз, когда он печатался, он говорит "PHP Fatal error:...", а во второй раз он просто говорит "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) (построено: 11 января 2012 г. 17:09:48)
Copyright (c) 1997-2012 PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

Код

http://pastebin.com/iBUGJ2eY
Это точный код, который отображает двойные исключения для меня, с пространством имен и путями, отредактированными для foos. Обратите внимание, что я всегда получаю двойные исключения в командной строке этой установки. Я почти уверен, что проблема заключается в конфигурации PHP.

4b9b3361

Ответ 1

Получил это воспроизведение. Первое сообщение об ошибке является результатом настройки log_errors и переходит в STDERR.

Вторая - результат display_errors и переходит в STDOUT.

Обе настройки могут быть изменены во время выполнения. Поэтому, чтобы "спросить PHP красиво", этого достаточно:

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