Возможно, этот вопрос относится к Переполнение стека или другой сайт, и в этом случае, пожалуйста, сообщите мне, а не просто голосуйте против; Я с радостью переставлю его.
В любом случае, я только изучаю самые основы управления сервером, и я играл со своим маленьким частным сервером MySQL на моем ноутбуке, когда я наткнулся на то, чего не ожидал. Когда я отправил запрос AJAX на страницу PHP с помощью jQuery $ .ajax () метод, я продолжал получать код ответа "200", хотя я вызвал функцию http_response_code(500);
в моем PHP-коде. Я не мог понять, почему это происходит, пока не понял, что использую echo
операторы для возврата данных на страницу Javascript и путем перемещения http_response_code(500);
функция для выше все из echo
операторов, он правильно установит код ответа HTTP.
Я понимаю, что это правильная функциональность, мне просто интересно, почему это так? Почему перед использованием эхо-функций необходимо установить код ответа HTTP? Что происходит в базовых протоколах? Я предполагаю, что это как-то связано с echo
заставляют скрипт возвращать данные при его вызове, но тогда зачем скриптам вроде следующего:
echo "thing one";
echo "thing two";
http_response_code(500);
echo "thing three";
... все еще эхо "вещь три" нормально, но не менять код ответа?
У меня нет "проблемы" как таковой, я здесь, чтобы учиться! Спасибо!
Когда вы печатаете что-либо на теле, заголовки уже должны быть отправлены. Это если вы, например, echo()
что-то или даже если перед <?php
. Веб-сервер просто не может ничего вывести до того, как отправит заголовки, поскольку это форма HTTP-ответа, в результате чего любой вывод также отправляет заголовки.
Если вы попытаетесь использовать, например, header()
который отправляет заголовок, вы можете получить Warning: Cannot modify header information - headers already sent by
.
Помни это
header()
должен вызываться перед отправкой любого фактического вывода либо с помощью обычных тегов HTML, либо с помощью пустых строк в файле, либо из PHP. Считывание кода с помощьюinclude
, илиrequire
, функции или другая функция доступа к файлу, и перед ними выводятся пробелы или пустые строки.header()
называется. Та же проблема существует при использовании одного файла PHP / HTML.
Так как http_response_code()
не отправляет заголовки HTTP, а только подготавливает список заголовков для отправки позже, это не вызовет эту ошибку. При использовании headers_sent()
в if
условие может предотвратить эти ошибки с помощью header()
, это также может быть полезно для устранения проблем при использовании http_response_code()
.