Буферизация вывода в PHP
Буферизация вывода в PHP, это способ указать что нужно отдельно сохранить данные перед их отправкой в браузер. То есть данные можно получить и поместить в переменную, дальше работать с ними а потом отправлять в браузер.
Буферов вывода в PHP несколько, плюс ещё модули web-сервера могут выполнять буферизацию, ещё и браузеры могут играться с выводом и не сразу отображать полученный результат.
Пользовательский буфер
для работы с пользовательским буфером используются функции с приставкойob_
, подробнее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() попытается сбросить только содержимое буферов, тогда как в веб-контексте сбрасываются заголовки и содержимое буферов |