Используйте случай для буферизации вывода как правильное решение для "уже отправленных заголовков",
Я вижу (не только на этом сайте) много вопросов от неопытных программистов PHP о печально известных "заголовках, уже отправленных... вывод начался с", и многие люди предлагают использовать буферизацию в качестве решения.
По моему опыту, я никогда не обнаружил ситуации, когда эта ошибка не была вызвана недостатком логики программы. Существуют ли случаи, когда буферизация вывода на самом деле является правильным решением?
Ответы
Ответ 1
Я согласен с вашим первоначальным выражением. Как правило, решение проблемы "заголовков" с буферизацией вывода является мерой остановки.
Очень грустная/забавная часть этого решения: что происходит, когда вы хотите вывести что-то большое, например, файл, который вы держите за платной? Обычно это приводит к тому, что люди заменяют проблему с заголовками, а их скрипты заканчиваются из памяти.
Упс.
Ответ 2
Единственная ситуация, которую я могу себе представить, - это CMS или Weblog, в которых плагины могут быть вызваны в HTML-коде, например
<h1>My images</h1>
{plugin:show_images}
этим плагинам, возможно, придется добавить свои собственные таблицы стилей и другие вещи, которые входят в раздел <head>
на странице. Используя буферизацию, это было бы возможно.
На практике, однако, это не хорошо для производительности, ощущается kludgy и не работает, когда буферизация вывода отключена. Поэтому даже здесь лучше предварительно обработать содержимое перед их показом и сделать любое добавление таблиц стилей и т.д., Прежде чем что-либо выйдет.
Ответ 3
для шаблонных систем вам понадобится ob_start... look и Zend_View
Позднее Редактировать
Я неправильно понял вопрос и представил случай, когда использование ob_start является допустимым решением.
Ответ 4
Возможно, вы захотите опубликовать переадресацию HTTP в конце потока, например, в шаблонах или обработке исключений. (Конечно, для платформы с шаблонами или для обработки глобальных исключений в любом случае нужна буферизация вывода, поэтому вы можете сказать, что это не решение этой проблемы.)
Ответ 5
По моему опыту, я никогда не обнаружил ситуации, когда эта ошибка не была вызвана потоком в логике программы. Существуют ли случаи, когда буферизация вывода на самом деле является правильным решением?
Я должен согласиться с вами, однако:
1) Одна из причин, по которой мне нравится PHP, заключается в том, что она позволяет вам выбрать, как вы решаете проблему.
2) существуют другие применения для output_buffering, кроме исправления сообщения "Уже отправленные сообщения", например. сжимающий выход, захват выходного кода, избегая кодирования с чередованием....
С.