Зачем использовать буферизацию вывода в PHP? - PullRequest
27 голосов
/ 27 января 2010

Я прочитал довольно много материала в Интернете, где разные авторы предлагают использовать буферизацию вывода. Самое смешное, что большинство авторов аргументируют его использование только потому, что оно позволяет смешивать заголовки ответов с реальным содержимым. Честно говоря, я думаю, что ответственные веб-приложения не должны смешивать выходные заголовки и контент, и веб-разработчики должны искать возможные логические недостатки в своих сценариях, которые приводят к отправке заголовков после генерации вывода. Это мой первый аргумент против ob_* API буферизации вывода. Даже для такого небольшого удобства, которое вы получаете - смешивая заголовки с выводом, - это недостаточно веская причина для его использования, если только вам не нужно быстро взламывать сценарии, что обычно не является целью или способом серьезного веб-приложения.

Кроме того, я думаю, что большинство людей, имеющих дело с API буферизации вывода, не думают о том факте, что даже если явно не включена явная буферизация вывода, PHP в сочетании с веб-сервером, к которому он подключен, все еще выполняет некоторые внутренние функции. буферизация в любом случае. Это легко проверить - сделайте эхо какой-нибудь короткой строки, поспите 10 секунд и сделайте еще одно эхо. Запросите ваш скрипт в браузере и наблюдайте за паузой пустой страницы в течение 10 секунд, после чего появятся обе строки. Прежде чем кто-то скажет, что это артефакт рендеринга, а не трафик, отслеживание фактического трафика между клиентом и сервером показывает, что сервер сгенерировал заголовок Content-Length с подходящим значением для всего вывода - предполагая, что вывод не был отправлен постепенно с каждым вызовом echo, но накапливается в некотором буфере и затем отправляется при завершении скрипта. Это одна из моих проблем с явной буферизацией вывода - зачем нам две разные реализации буфера вывода друг на друга? Может ли это быть из-за того, что внутренняя (недоступная) буферизация вывода PHP / Web-сервера зависит от условий, которые разработчик PHP не может контролировать, и, таким образом, на самом деле не используется?

В любом случае, я, например, начинаю думать, что следует избегать явной буферизации вывода (серии функций ob_*) и полагаться на неявную, помогая ей с хорошей функцией flush, когда это необходимо. Может быть, если бы была какая-то гарантия от веб-сервера на фактическую отправку вывода клиенту при каждом вызове echo / print, тогда было бы полезно установить явную буферизацию - ведь никто не хочет отправлять ответ клиенту с какими-то 100 байтовые куски. Но альтернатива с двумя буферами выглядит несколько бесполезным уровнем абстракции.

Так, в конечном счете, серьезным веб-приложениям нужна буферизация вывода?

Ответы [ 11 ]

0 голосов
/ 27 января 2010

Это полезно, если вы пытаетесь отобразить индикатор выполнения на странице, обработка которой занимает некоторое время. Поскольку PHP-код не является многопоточным, вы не сможете этого сделать, если обработка зависает с использованием 1 функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...