Буферизация вывода в PHP. Как управлять данными, отправляемыми пользователю?

буферизация вывода в php. как управлять данными, отправляемыми пользователю?

Для чего нужна буферизация

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

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

Заметка
Буферизация также является гибким инструментом контроля выводимой информации. Приложение может работать с несколькими буферами, а также согласно условиям сбрасывать одни из них и показывать пользователю другие. Всё это будет рассмотрено в следующих уроках.

Использование буфера вывода

PHP позволяет использовать буферизацию двумя способами: с помощью специальных функций и за счет конфигурации php.ini. Если вы хотите включить буферизацию для всех файлов по умолчанию, установите в php.ini следующую опцию «output_buffering=On».

Ручное управление буферами вывода данных происходит с использованием ряда функций. ob_start() отвечает за создание нового буфера. Весь вывод с использованием echo или print, идущий сразу за ob_start() будет сохранен для дальнейшего обращения. Функция возвращает true в случае успеха и false, если произошла ошибка.

Вывод данных, записанных в буфер, осуществляется с помощью ob_flush(). Вы также можете уничтожить информацию без её показа за счет функции ob_clean(). Очень важной особенностью ob_flush() и ob_clean() является то, что они не уничтожают хранилище. То есть после очистки или вывода данных буфер можно использовать повторно.

Также существуют функции ob_end_flush() и ob_end_clean(). Они обладают аналогичным поведением с одним лишь отличием — буфер вывода данных уничтожается после вызова. Чтобы продолжить дальнейшее сохранение вывода нужно снова использовать функцию ob_start().

//Записываем простую строку в буфер
if (ob_start()) {
    echo 'Привет из буфера!';
    ob_end_flush();
    /*
    * Результат:
    * Привет из буфера!
    */

} else {
    echo 'Невозможно создать буфер вывода';
}


//Пример очистки и перезаписывания
if (ob_start()) {
    echo 'Привет из буфера!';
    ob_clean();

    echo 'Новое приветствие!';
    ob_end_flush();
    /*
    * Результат:
    * Новое приветствие!
    */

} else {
    echo 'Невозможно создать буфер вывода';
}

Последние публикации