#php #header #buffer #buffering #output-buffering
#php #заголовок #буфер #буферизация #вывод-буферизация
Вопрос:
Я написал класс, который выводит информацию о типе содержимого в виде заголовка, однако это не работает. После прочтения PHP.net в нем говорится
Помните, что header() должен вызываться перед отправкой любого фактического вывода, будь то с помощью обычных тегов HTML, пустых строк в файле или из PHP. Очень распространенной ошибкой является чтение кода с помощью функций include() или require(), функций или другой функции доступа к файлам и наличие пробелов или пустых строк, которые выводятся перед вызовом header() .
Я не уверен, что делать, поскольку я не могу жестко закодировать тип содержимого везде, где это необходимо. Кто-нибудь знает, возможно ли вообще устанавливать заголовки в функциях / классах?
Ответ №1:
Ограничение заключается в том, что заголовки должны быть отправлены до отправки любого другого вывода.
Самым простым решением было бы включить буферизацию вывода. Таким образом, вы можете устанавливать заголовки в любом месте, пока буфер не будет очищен.
Вы можете сделать это с помощью функции ob_start
Или с помощью директивы output_buffering
ini в файле php.ini.
Как указал Брэд, это не самое эффективное решение, поскольку оно занимает память сервера для буферизации выходных данных и задерживает отправку первого байта.
Лучшим решением было бы найти то, что отправляет вывод перед header
вызовом, и задержать вывод, если это возможно.
Хорошим компромиссом, который я нашел, было включить буферизацию вывода с использованием ob_start
в начале и промывкой буфера сразу после <head>
создания элемента страницы и установки всех необходимых заголовков. Таким образом, любой дальнейший вывод не буферизуется. Единственное, о чем нужно позаботиться, это о том, чтобы все вызовы заголовков выполнялись перед ob_end_flush
вызовом.
Комментарии:
1. Читайте как: самый простой , а не самый эффективный . Просто разъясняю. Все еще 1 для самого простого варианта.
2. Я пытался найти, где я мог бы выводить что-либо перед этой функцией, которая задает заголовок, но ничего не могу найти, я также попробовал метод ob_start, который вы предложили, но все равно без радости. Я использую CURL и метод GET HTTP для запуска файла, в котором я пытаюсь установить заголовок HTTP. Может ли это быть причиной проблемы?
3. @LeeTee При использовании браузера, CURL или даже file_get_contents выполнение скрипта будет таким же. Откуда вы знаете, что это не работает? Если ошибка связана с выводом, который уже был отправлен до вызова заголовка, генерируется предупреждение, оно должно отображаться в вашем error_log. Так как же это не работает ТОЧНО?
4. Я в основном удалил весь код из файла и просто вызвал функцию, которая устанавливает заголовок HTTP, и она все еще не работает. Однако, когда я перехожу непосредственно к этому файлу из браузера вместо доступа к файлу с помощью CURL, это работает.
Ответ №2:
Заголовки все время отправлялись правильно, но я проверял ответ файла, который я использовал, и неправильно получал ответ от CURL, если это имеет смысл! Мне просто нужно было использовать:
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);