Как заставить PHP автоматически устанавливать код состояния HTTP на 500 в случае возникновения ошибки? (включая те, которые не могут быть обработаны пользователем)

Я использую Apache 2.2.15 с PHP 5.3.2, "display_errors" отключен, "display_startup_errors" отключен, "log_errors" включен.

При моей настройке (так что я считаю это нормой) PHP прерывает работу по фатальным ошибкам, что хорошо, и устанавливает код состояния HTTP на 500. К фатальным ошибкам относятся E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR и, возможно, E_RECOVERABLE_ERROR (не может вызвать его самостоятельно, поэтому не может легко проверить, что происходит). Я думаю, что это хорошая идея, что он устанавливает код на 500, потому что я думаю, что это правильно - очевидно, если ваш скрипт содержит синтаксические ошибки и / или не в состоянии делать то, что должен делать во время выполнения, это ошибка сервера, если мы рассмотрим PHP часть сервера.

Теперь вот важная часть:

В любом случае, я теперь установил XDebug, чтобы лучше отслеживать ошибки, но теперь я вижу, что, независимо от ошибки, даже если сценарий прерывается, как и раньше, при фатальных ошибках, код состояния HTTP всегда равен 200. Это ломает мой клиент, который "общается" с Apache/PHP через HTTP:|

Кроме того, если для display_errors задано значение On/1, PHP больше не будет устанавливать код состояния HTTP на 500 и будет вести себя точно так же, как и в случае с XDebug выше.

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

ОБНОВИТЬ

В блоге есть сообщение, посвященное проблеме: http://talideon.com/weblog/2008/02/php-errors.cfm

Со своей стороны, я отключил XDebug, потому что именно это и вызывает плохое поведение. В любом случае я использовал его только для трассировки стека, а теперь вместо этого использую собственный обработчик ошибок. Кроме того, связанная статья написана в 2008 году, очевидно, PHP в настоящее время автоматически устанавливает код состояния HTTP на 500. Здесь это так. Без XDebug, конечно.

1 ответ

Я предполагаю, что вы используете пользовательский обработчик ошибок для выдачи 500.

Я не очень хорошо знаю XDebug, но, согласно этой статье, он регистрирует свой собственный обработчик ошибок, возможно, переопределяя ваш в процессе:

Обратите внимание, что расширенное отображение ошибок xdebug не работает, если вы определяете пользовательский обработчик ошибок с помощью register_error_handler(). Это потому, что xdebug внутренне использует тот же механизм. Если в ваших сценариях используется пользовательский обработчик ошибок, вы все равно можете использовать функцию xdebug_get_function_stack() для вывода трассировки стека в свой пользовательский обработчик ошибок.

Однако для производственного использования вы все равно не собираетесь активировать XDebug?

Что касается того, почему 200 выводится при активации display_errors(), что я не понимаю. Можете ли вы опубликовать свою собственную функцию обработчика ошибок для просмотра?

Другие вопросы по тегам