Настройка заголовков PHP в методе функции / класса

#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);