Я прочитал довольно много материалов в Интернете, где разные авторы предлагают использовать буферизацию вывода. Самое забавное, что большинство авторов аргументируют его использование только потому, что он позволяет смешивать заголовки ответов с фактическим содержимым. Честно говоря, я думаю, что ответственные веб-приложения не должны смешивать вывод заголовков и контента, а веб-разработчикам следует искать возможные логические недостатки в своих сценариях, которые приводят к отправке заголовков после вывода. Это мой первый аргумент против API-буферизации вывода ob_*
. Даже для этого небольшого удобства вы получаете - микширование заголовков с выходом - это не очень хорошая причина для его использования, если не нужно быстро взламывать скрипты, что обычно не является целью и способом серьезного веб-приложения.
Кроме того, я думаю, что большинство людей, работающих с API буферизации вывода, не думают о том, что даже без явной буферизации вывода, PHP в сочетании с веб-сервером подключен, все еще делает некоторые внутренние буферизация. Легко проверить - сделать эхо короткой строки, спать на 10 секунд и сделать еще одно эхо. Запросите script с помощью браузера и посмотрите паузу на пустой странице в течение 10 секунд, после чего появятся обе строки. Прежде чем кто-то скажет, что это артефакт рендеринга, а не трафик, отслеживающий фактический трафик между клиентом и сервером, показывает, что сервер сгенерировал заголовок Content-Length
с соответствующим значением для всего вывода - что вывод не был отправлен постепенно с каждым вызовом echo
, но накапливается в некотором буфере, а затем отправляется на завершение script. Это одна из моих проблем с явной буферизацией вывода - почему нам нужны две разные реализации буфера вывода друг над другом? Может быть, потому, что внутренняя (недоступная) буферизация вывода на PHP/Web-сервере зависит от условий, которые разработчик PHP не может контролировать и, следовательно, не может использоваться?
В любом случае, для начала, подумайте, что нужно избегать явной буферизации вывода (серии функций ob_*
) и полагаться на неявный, помогая ему с хорошей функцией flush
, когда это необходимо. Возможно, если бы на веб-сервере была какая-то гарантия для отправки вывода клиенту с каждым вызовом echo/print, тогда было бы полезно настроить явную буферизацию - ведь никто не хочет отправлять ответ клиенту с 100 байтовые куски. Но альтернатива с двумя буферами кажется несколько бесполезным слоем абстракции.
Итак, в конечном счете, для серьезных веб-приложений нужна буферизация вывода?