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