Пример использования буферизации вывода в качестве правильного решения для уже отправленных заголовков

Я вижу (не только на этом сайте) много вопросов от неопытных PHP-программистов по поводу печально известной ошибки «заголовки уже отправлены... вывод начался с», и многие люди предлагают использовать буферизацию вывода в качестве решения.

На своем опыте я ни разу не встречал ситуации, когда эта ошибка не была вызвана изъяном в логике программы. Есть ли случаи, когда буферизация вывода действительно является правильным решением?


person Matteo Riva    schedule 27.05.2010    source источник


Ответы (5)


Я бы согласился с вашим первоначальным утверждением. Как правило, решение проблемы «заголовков» с буферизацией вывода является временной мерой.

По-настоящему грустная/забавная часть этого решения заключается в следующем: что происходит, когда вы хотите вывести что-то большое, например файл, который вы храните за платным доступом? Обычно это приводит к тому, что люди заменяют проблему «заголовков» на то, что их скриптам не хватает памяти.

Упс.

person ivans    schedule 27.05.2010

Единственная ситуация, которую я могу себе представить, это CMS или Weblog, в которых плагины могут вызываться в HTML-коде, например

<h1>My images</h1>
{plugin:show_images}

этим плагинам, возможно, придется добавить свои собственные таблицы стилей и другие вещи, которые находятся в разделе <head> страницы. Используя буферизацию, это было бы возможно.

Однако на практике это плохо сказывается на производительности, кажется неуклюжим и не работает, когда буферизация вывода отключена. Поэтому даже здесь лучше предварительно обработать содержимое перед его отображением и добавить какие-либо таблицы стилей и т. д., прежде чем что-либо будет выводиться.

person Pekka    schedule 27.05.2010
comment
Я думаю, вы говорите о другом вопросе. HTML ‹head› отличается от заголовка HTTP. - person ZZ Coder; 27.05.2010
comment
@ZZ Coder нет, я говорю о вставке кода в место, которое находится над местом, которое вы обрабатываете в данный момент. Является ли это другой позицией внутри элемента <body> или <head>, на самом деле не имеет значения. Речь идет об использовании буферизации для изменения вывода перед его отправкой. - person Pekka; 27.05.2010
comment
@Pekka웃 На самом деле это не то, о чем был вопрос. - person user253751; 27.01.2016

Возможно, вы захотите выполнить перенаправление HTTP в конце потока, например, в шаблонах или обработке исключений. (Конечно, фреймворку с шаблонами или глобальной обработкой исключений в любом случае потребуется буферизация вывода, поэтому можно сказать, что это не решение конкретно этой проблемы.)

person Tgr    schedule 27.05.2010

На своем опыте я ни разу не встречал ситуации, когда эта ошибка не была вызвана потоком в логике программы. Есть ли случаи, когда буферизация вывода действительно является правильным решением?

Однако вынужден с вами согласиться:

1) Одна из причин, по которой мне нравится PHP, заключается в том, что он позволяет вам выбирать, как решать проблему.

2) есть и другие способы использования output_buffering, кроме исправления сообщения «Заголовки уже отправлены» — например. сжатие вывода, захват вывода произвольного кода, избегание фрагментированного кодирования....

C.

person symcbean    schedule 27.05.2010

для систем шаблонов вам понадобится ob_start... смотрите и Zend_View

Позднее редактирование Я неправильно понял вопрос и представил случай, когда использование ob_start является допустимым решением.

person Gabriel Solomon    schedule 27.05.2010
comment
Правда, это нужно системам шаблонов. Однако вопрос касается уже отправленных заголовков. - person deceze♦; 27.05.2010
comment
solomongaby подразумевает, что некоторые системы шаблонов используют буферизацию вывода для рендеринга фрагментов шаблона, которые будут объединены на каком-то более позднем этапе рендеринга. Однако, хотя это допустимое использование буферизации вывода, это не объяснение того, почему буферизация может быть допустимым способом решения проблемы заголовков, которая является исходным вопросом. - person ivans; 27.05.2010