Почему ошибки 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.
Ответы
Ответ 1
Получил это воспроизведение. Первое сообщение об ошибке является результатом настройки log_errors
и переходит в STDERR
.
Вторая - результат display_errors
и переходит в STDOUT
.
Обе настройки могут быть изменены во время выполнения. Поэтому, чтобы "спросить PHP красиво", этого достаточно:
ini_set('log_errors', 1);
ini_set('display_errors', 0);