Полный цикл в digital

Буферизация вывода в PHP

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

Буферов вывода в PHP несколько, плюс ещё модули web-сервера могут выполнять буферизацию, ещё и браузеры могут играться с выводом и не сразу отображать полученный результат.

  1. Пользовательский буфер для работы с пользовательским буфером используются функции с приставкой ob_, подробнее
  2. Cистемный буфер для работы с системным буфером используется одна функция flush(), подробнее

Зачем использовать буферизацию

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

Пример 1

Вы когда-нибудь видели ошибку ниже в своей работе:

Warning: Cannot modify header information — headers already sent by (output started at /some/file.php:12) in /some/file.php on line 23

Кто не знаком с определением HTTP-заголовка — это информация, отправляемая с сервера по HTTP-запросу. Она сообщает браузеру, какие данные передаются, прежде чем попадут к нему.

HTTP-заголовки содержат данные про тип содержимого, дату его последнего изменения, тип отправившего запрос сервера и многое другое. HTTP-заголовки необходимо отправлять до того, как с сервера будут отправлены первые выходные данные.

Пример 2

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

Тут вступает в действие буферизация вывода, которая позволяет сказать: «Привет, PHP! Я скажу, когда нужно отправить вывод сайта после того, как будут обработаны cookie-файлы». В ином случае вы просто столкнетесь с ошибкой, про которую я писала чуть выше.

Функции для работы с пользовательским буфером

Функция Результат работы
ob_start() Запускает выходной буфер, любой вывод, размещенный после этого, будет снят и не будет отображаться
ob_get_contents() Возвращает весь контент, захваченный ob_start()
ob_end_clean() Опорожняет выходной буфер и отключает его для текущего уровня вложенности
ob_get_clean() Триггеры: ob_get_contents() и ob_end_clean()
ob_get_level() Возвращает текущий уровень вложенности выходного буфера
ob_flush() Сбросьте буфер содержимого и отправьте его в браузер без завершения буфера
ob_implicit_flush() Включает скрытую промывку после каждого выходного вызова
ob_end_flush() Сбросьте буфер содержимого и отправьте его в браузер, также закончив буфер
ob_clean() Удаляет все из буфера, функция ничего не выводит, а просто очищает буфер

Наглядная табличка по семейству функций для пользовательского буфера:

Функция Вернёт Очистит Отправит Отключит
ob_get_contents() X
ob_end_clean() X X
ob_get_clean() X X X
ob_flush() X
ob_end_flush() X X
ob_clean() X
ob_get_flush() X X X

Функция для работы с системным буфером

Функция Результат работы
flush() Сбрасывает системные буферы записи PHP и серверной части, которой пользуется PHP (например: CGI, веб-сервер). В среде командной строки функция flush() попытается сбросить только содержимое буферов, тогда как в веб-контексте сбрасываются заголовки и содержимое буферов
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг