Да
Серьезным веб-приложениям нужна буферизация вывода в одной конкретной ситуации:
Ваше приложение хочет контролировать то, что выводится какой-либо третьей стороной
код , но нет API для управления тем, что этот код генерирует.
В этом сценарии вы можете позвонить ob_start()
непосредственно перед вручением
контроль над этим кодом, возиться с тем, что написано (в идеале с
обратный вызов, или путем проверки содержимого буфера, если необходимо), и
затем звоните ob_flush()
.
В конечном счете, PHP-функции ob_ - это механизм для захвата того, что какой-то другой бит кода делает в буфере , с которым может связываться .
Если вам не нужно проверять или изменять то, что записывается в буфер, ничего не получается с помощью ob_start()
.
Вполне вероятно, что ваше "серьезное приложение" на самом деле является своего рода фреймворком.
В любом случае, у вас уже есть выходная буферизация
Вам не нужно ob_start()
, чтобы использовал буферизацию вывода. Ваш веб-сервер уже делает буферизацию вашего вывода.
Использование ob_start()
не дает вам лучшей буферизации вывода - это может фактически увеличить использование памяти вашего приложения и задержку за счет «накопления» данных, которые веб-сервер в противном случае уже отправил бы клиенту .
Может быть ob_start()
...
... для удобства при промывке
В некоторых случаях вам может потребоваться контроль над , когда веб-сервер очищает свой буфер, основываясь на некоторых критериях, которые ваше приложение знает лучше всего. В большинстве случаев вы знаете, что вы только что закончили писать логический «модуль», который может использовать клиент, и вы говорите веб-серверу сбрасывать now и не ждать выходного буфера заполнить. Для этого просто необходимо вывести ваш вывод в обычном режиме и пунктуировать его с помощью flush()
.
В редких случаях вы захотите скрыть данные с веб-сервера, пока у вас не будет достаточно данных для отправки. Нет смысла мешать клиенту половиной новостей, особенно если остальные станут доступными. Простой ob_start
, заключенный позже ob_end_flush()
, действительно может быть самым простым и подходящим делом.
... если вы несете ответственность за определенные заголовки
Если ваше приложение берет на себя ответственность за вычисление заголовков, которое можно определить только после получения полного ответа, тогда может быть приемлемым.
Однако даже здесь, если вы не можете сделать что-то лучше, чем получить заголовок, проверив полный выходной буфер, вы можете также позволить веб-серверу сделать это (если это будет). Код веб-сервера написан, протестирован и скомпилирован - вряд ли вы улучшите его.
Например, было бы полезно установить заголовок Content-Length
, только если ваше приложение знает длину тела ответа до того, как оно вычислит тело ответа.
Нет панацеи от плохой практики
Вы не должны ob_start()
избегать дисциплин:
- открытие , с использованием и быстрое закрытие ресурсов, таких как память, потоки и соединения с базой данных
- сначала заголовки, а затем тело
- все вычисления и обработка ошибок выполняются до начала ответа
Если вы сделаете это, они вызовут технический долг, который однажды заставит вас плакать.