Вариант использования для вывода, буферизующего как правильное решение “заголовков, уже отправленных”

Я вижу (не только на этом сайте) большой вопрос от неопытных PHP программистов о печально известных "заголовках, уже отправленных... вывод, запущенный в" ошибке, и многие люди предлагают использовать ouput, буферизующий в качестве решения.

По моему опыту, я никогда не находил ситуацию, где та ошибка не была вызвана дефектом в логике программы. Есть ли случаи, где произведено, буферизация является на самом деле правильным решением?

7
задан Matteo Riva 27 May 2010 в 16:54
поделиться

5 ответов

Я согласен с вашим первоначальным заявлением. Как правило, решение проблемы «заголовков» с помощью буферизации вывода - временная мера.

Действительно грустная / забавная часть этого решения: что происходит, когда вы хотите вывести что-то большое, например, файл, который вы храните за платным доступом? Обычно это приводит к тому, что люди заменяют проблему «заголовков» на то, что их скриптам не хватает памяти.

Упс.

5
ответ дан 7 December 2019 в 07:40
поделиться

Единственная ситуация, которую я могу себе представить, это CMS или Weblog, в котором плагины могут быть вызваны в HTML-коде, как

<h1>My images</h1>
{plugin:show_images}

эти плагины могут добавить свои собственные таблицы стилей и другие вещи, которые идут в раздел страницы. Используя буферизацию, это было бы возможно.

На практике, однако, это не очень хорошо для производительности, выглядит неуклюже и не работает, когда буферизация вывода отключена. Поэтому даже здесь лучше предварительно обрабатывать содержимое перед показом, а также добавлять таблицы стилей и т.д. перед выводом.

2
ответ дан 7 December 2019 в 07:40
поделиться

Вам может понадобиться создавать HTTP-перенаправления на поздних этапах работы, например, в шаблонах или при обработке исключений. (Конечно, фреймворк с шаблонизацией или глобальной обработкой исключений в любом случае потребует буферизации вывода, так что можно сказать, что это не решение конкретно этой проблемы)

.
0
ответ дан 7 December 2019 в 07:40
поделиться

По моему опыту, я никогда не встречал ситуации, когда эта ошибка не была бы вызвана потоком в логике программы. Существуют ли случаи, когда буферизация вывода на самом деле является правильным решением?

Однако я должен с вами согласиться:

1) Одна из причин, по которой мне нравится PHP, заключается в том, что он позволяет вам выбирать способ решения проблемы

2) есть другие способы использования output_buffering, кроме исправления сообщения «Заголовки уже отправлены» - например, сжатие вывода, захват вывода произвольного кода, избегание кодирования по частям ....

C.

0
ответ дан 7 December 2019 в 07:40
поделиться

для шаблонных систем вам понадобится ob_start ... посмотрите и Zend_View

Later Edit Я неправильно понял вопрос и привел случай, когда использование ob_start является правильным решением.

0
ответ дан 7 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: