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

Как заставить PHP регистрировать stacktrace при фатальной ошибке

Я настроил php для ошибок журнала и на моей машине разработки, они отображаются в журналах ошибок apache как:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP   1. {main}() /Users/troelskn/Projects/test/public/index.php:0

Однако на производственных машинах (Ubuntu) после ошибки не возникает stacktrace, и к сообщению добавляется реферер. Например. это будет выглядеть так:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27, referer: http://localhost/

Как я могу управлять этим форматированием? Я бы очень хотел, чтобы в журналах была доступна стек.

4b9b3361

Ответ 1

Ну, как уже указывалось, вы не получаете одинаковое форматирование на live-машине, потому что у живой машины не установлено xdebug. Существует debug_backtrace, но это не приведет к фатальной ошибке.

Вы можете установить xdebug на реальном сервере, но вам нужно быть очень осторожным, чтобы настроить его, чтобы не показывать никаких функций, кроме ведения журнала трассировки стека. Незначительное использование xdebug в реальном времени может представлять угрозу безопасности, поскольку люди могут инициировать удаленный сеанс отладки, или его расширенные сообщения об ошибках могут непреднамеренно отражать внутренние детали вашего кода.

Честно говоря? Я бы подумал, что ваш лучший вариант - попытаться воссоздать обстоятельства, при которых произошла ошибка, на которой был зарегистрирован живой сервер на вашем тестовом сервере.

РЕДАКТИРОВАТЬ ДОБАВИТЬ: забыл упомянуть, что помимо риска для безопасности xDebug также будет иметь негативное влияние на производительность вашего сайта. Он подключается к Zend Engine несколькими ключевыми способами для регистрации состояния программы и изменения ее поведения (например, переопределения @подавления ошибок), и это будет иметь неизбежное влияние на производительность. Вы в основном гораздо лучше пытаетесь реплицировать проблему в тестовой среде, чем добавляете инструменты отладки в живую.

Ответ 2

Вы можете проследить с помощью debug_backtrace или debug_print_backtrace хотя я их никогда не использовал. Лучшее отслеживание происходит из xdebug или отладчик Zend. Я согласен с Gordon в том, что вы не должны устанавливать отладчик на производственную машину.