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

Я использую 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 выше.

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

UPDATE

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

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

1 Ответ

2 голосов
/ 19 июня 2010

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

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

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

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

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

...