Dlaczego błędy PHP są drukowane dwa razy?

Podsumowanie

O dziwo nie znalazłem nic na ten temat w Google. Kiedy rzucam wyjątek w PHP, pojawia się on w mojej konsoli dwa razy, wraz z Komunikatem o błędzie i śladem stosu. Po pierwszym wydrukowaniu napis " PHP Fatal error: ..."i za drugim razem po prostu mówi" Fatal error: ...". Nie testowałem to jest wersja wtyczki Apache.

Przykład

Z niektórymi przestrzeniami nazw i ścieżkami skróconymi przez '..."dla bezpieczeństwa:

$ 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

Pytanie

I Załóżmy, że ma to coś wspólnego ze stderr i stdout, które wypisują błąd. W każdym razie jak mam ładnie prosić PHP żeby wydrukował tylko raz, najlepiej na stderr?


Wersja wyjściowa

PHP 5.3.9 (cli) (zbudowany: Jan 11 2012 17:09:48)
Copyright (c) 1997-2012 Grupa PHP
Zend Engine v2. 3. 0, Copyright (c) 1998-2012 Zend Technologies

Kod

Http://pastebin.com/iBUGJ2eY
Jest to dokładny kod, który wyświetla podwójne wyjątki dla mnie, z przestrzeniami nazw i ścieżkami edytowanymi na foos. Zauważ, że zawsze dostaję podwójne wyjątki w wierszu poleceń tej instalacji. Jestem całkowicie pewien, że problem leży w konfiguracji PHP.

 25
Author: Hubro, 2012-01-25

1 answers

Mam to odtworzone. Pierwszy komunikat o błędzie jest wynikiem ustawienia log_errors i przechodzi do STDERR.

Drugi jest wynikiem display_errors i przechodzi do STDOUT.

Oba ustawienia mogą być zmieniane podczas wykonywania. Aby więc "ładnie zapytać PHP", wystarczy:

ini_set('log_errors', 1);
ini_set('display_errors', 0);
 33
Author: Linus Kleen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-25 12:25:05