2009-10-12 3 views
23

Просто хочу выбрать мозги экспертов по буферизации вывода php. Бывают случаи, когда я хотел бы реализовать это по той или иной причине, но мне всегда удалось изменить свой код, чтобы обойти его.PHP буферизация вывода - звучит как плохая идея, не так ли?

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

Я ухожу сюда?

ответ

19

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

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

+1

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

+1

Существует логическая причина повышения производительности - php не «ломается от обработки», поэтому обработка выполняется намного быстрее, потому что она непрерывна - то же самое касается самой передачи данных. Конечно, кажется, что он будет использовать больше памяти за раз, но он удерживает ее на более короткое время. Хотя вы, вероятно, загружаете некоторые фреймворки/библиотеки, которые занимают гораздо больше, поэтому это не должно быть существенной разницей, учитывая «нормальный» объем исходного кода output-ed ... :-) –

8

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

В большинстве случаев сжигание кучу времени программиста для сохранения неизвестного количества (дешевой) памяти звучит как пустая трата ресурсов.

+0

Есть мысль ... использовать ее, но есть способ отключить ее, когда выход массивный. Хороший вопрос, мужик! – Aaron

+1

Самый простой способ «отключить его» для сценария с большим количеством выходных данных (подумайте, что какой-то отчет, который отправляет кучу данных csv или что-то еще), - это просто ob_end_flush(); вверху вашего скрипта. Вы можете (попытаться) вывести выход из своей петли с помощью flush(); – timdev

4

Используя буферизацию вывода, я смог быстро сделать систему шаблонов легкого веса для домашней базы MVC для моего последнего проекта PHP. Я люблю его и считаю его очень полезным.

И относительно ресурсов: это не тот ресурс, который интенсивный. Если вы беспокоитесь о том, как мало он использует, PHP не является подходящим инструментом для этой работы. Я люблю PHP, но это НЕ самый легкий вариант. Однако на любом разумно современном сервере это не имеет значения.

+0

@ Dinah, у меня создалось впечатление, что PHP был суперлегким ... но это, вероятно, потому, что я привык к ColdFusion. Что еще легче? – Aaron

+1

@Aaron C, или ASM. PHP - это такой гибкий язык, который обычно медленнее, чем любой другой язык рабочего стола, такой как C, C++, Java, C# и т. Д. Однако, по сравнению с другими языками сценариев, он все равно может быть довольно быстрым. – phihag

4

Если вы находитесь в ситуации, когда контент выводится перед заголовками, вам нужно заполнить его в буфере, иначе страница будет выходить из строя, чтобы содержимое выводилось перед заголовками. Это случилось со мной с общими библиотеками и не хватило времени, чтобы войти и сделать правильное исправление, чтобы начать. Это один из тех отметок // TODO/FIXME, а затем вернитесь и сделайте это позже.