Intereting Posts
Разделение содержимого MySQL через PHP по принципу «для каждой страны / пользователя» «Для запроса этого ресурса требуется токен доступа пользователя». График Facebook для уведомлений Чтение метаданных файла Получить данные из url и сохранить в php Можно ли хранить байт-код HHVM в виде файла? Подключить mySQL с Android Как реализовать авторизацию с помощью API Telegram? Как избежать строк в pdo? Как расшифровать строку с помощью OpenSSL, которая ранее была зашифрована с помощью mcrypt? Очистить форму после отправки и успешного сообщения Как искать массив для нескольких значений в PHP? Обновление нескольких индикаторов выполнения при отправке нескольких файлов и элементов формы через ajax Когда использовать strtr vs str_replace? Запрос Mysql и PHP LIKE не генерирует никаких результатов на странице, но возвращает результат в Mysql Прочитать подтверждение с помощью PHPMAILER

Как заставить 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, конечно.

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

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

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

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

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