Я разрабатываю приложение PHP, которое использует коды ответа HTTP для связи, а также органы реагирования. Итак, это типичный сценарий в PHP-коде:
try { doSomething(); } catch (Exception $e) { header('HTTP/1.1 500 Internal Server Error'); }
… и типичный код в клиентах выглядит так:
switch(responseCode) { case 200 : // all fine // .... case 500 : // trouble! }
Это классно, если каждая ошибка хорошо поймана в PHP-коде.
Проблема. Если по какой-либо причине в php-коде произошла неперехваченная ошибка или непонятная ошибка, например синтаксические ошибки , Apache отправит 200 OK. Но я не буду говорить об ошибке 500 Internal Server Error. Может быть, за .htaccess или около того.
Вы можете, конечно, написать свой собственный обработчик ошибок . Однако не все ошибки PHP увлекательны. Например, синтаксическая ошибка даже не позволит запустить ваш код, включая обработчик ошибок.
Чтобы обрабатывать захватывающие ошибки, вы можете использовать директивы auto_append_file и auto_prepend_file для размещения кода кода обработки ошибок.
Непривлекательные ошибки – это другая проблема. Если PHP работает как быстрый CGI , он автоматически генерирует для вас код состояния 500. Однако вы, вероятно, используете PHP через какой-то другой SAPI (такой как модуль Apache). Не знаю, извините. (Я отчитаю, если найду что-нибудь.)
Заголовки ответов не отправляются до тех пор, пока PHP не повторит первый байт тела ответа. Вы можете изменить заголовки (и код состояния) в среднее время. Имея это в виду, вот решение:
Установите скрипт для отправки кода ответа 500
в начале скрипта и 200
в конце. Вот пример:
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error'); if (rand(0, 1) == 1) { die("Script terminated prematurely"); } header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); echo "Success";
Просто убедитесь, что код ответа 200
установлен только в одном месте вашего кода.
Примечание. Вместо header
вы можете использовать http_response_code
(PHP> = 5.4).
В настоящее время это уже не проблема, так как 5.3 PHP научился, наконец, отправить 503 на ошибку, а не на 200
Err, похоже, это было 5.2.4 :
Изменен обработчик ошибок для отправки HTTP 500 вместо пустой страницы на ошибках PHP.
Вам нужно установить display_errors = off
чтобы он работал
У меня точное поведение на моих окнах Apache 2.4 с PHP 5.4.5