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

Я вижу (не только на этом сайте) много вопросов от неопытных программистов 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, кроме исправления сообщения "Уже отправленные сообщения", например. сжимающий выход, захват выходного кода, избегая кодирования с чередованием....

С.