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.
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);
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