Почему ошибки PHP печатаются дважды? - PullRequest
28 голосов
/ 25 января 2012

Резюме

Удивительно, но я ничего не мог найти об этом в Google или ТАК. Когда я генерирую исключение в 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 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

код

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

1 Ответ

36 голосов
/ 25 января 2012

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

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

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

ini_set('log_errors', 1);
ini_set('display_errors', 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...