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

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

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

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

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

Упс.

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

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

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

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

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

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

Я должен согласиться с вами, однако:

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

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

C.

для шаблонных систем вам понадобится ob_start … look и Zend_View

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