Как заставить 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, потому что я думаю, что это правильная вещь - очевидно, если ваш script содержит синтаксические ошибки и/или не выполняет то, что должно выполняться во время выполнения, это ошибка сервера, если мы рассматриваем PHP-часть сервера.

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

В любом случае, я теперь установил XDebug для лучшего отслеживания ошибок, но теперь я вижу, что независимо от этой ошибки, несмотря на то, что script прерывается, как и раньше, при фатальных ошибках, код состояния 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

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

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

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

Однако, для использования в целях производства вы не собираетесь активировать XDebug в любом случае, не так ли?

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