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