Я вижу (не только на этом сайте) много вопросов от неопытных программистов 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 является допустимым решением.