PHP: Буферизация вывода - Повторное использование буферов

PHP: Буферизация вывода - Повторное использование буферов

Индекс материала
PHP: Буферизация вывода
Повторное использование буферов
Чтение буферов вывода
Сжатие выходных данных
Все страницы

Повторное использование буферов

Функции ob_end_flush() и ob_end_clean() дополняются функциями: ob_flush() и ob_clean() - они делают то же самое, но не закрывают буфер вывода. Верхний пример с их применением может выглядеть так:

ob_start();
echo '<p>первый</p>';
ob_flush();
echo '<p>второй</p>';
ob_сlean();
echo '<p>третий</p>';

Этот скрипт выведет результат:

<p>первый буфер </p>
<p>третий буфер </p>

Смотрим сверху вниз. На этот раз содержимое выводится так же строка 1-3, но буфер не закрывается, затем буфер просто чистится (строа 5) без вывода содержимого, оставаясь открытым, и наконец буфер автоматом закрывается, а содержимое выводится, так как подошёл конец скрипта. Такой подход даст 60% прирост производительности, по сравнению с предыдущим, за счёт того, что мы избегаем лишних открытий/закрытий буферов.

Стек буферов

Если рассматривать буферы вывода как контейнеры, то вполне можно понять тот факт, что один контейнер - буфер, можно поместить внутрь другого, создав некий стек буферов, который в свою очередь подчиняется определённым правилам. Стек буферов приблизительно можно представить так:

Стек буферов вывода

Подпись "уровень" - это фактический уровень вложенности буфера. Когда в коде следует инструкция очистить буфер и вывести его содержимое ( например вызов функции ob_end_flush() ), то содержимое буфера выводится внутрь его родительского контейнера. Если родительского контейнера нет, то содержимое выводится в основной поток, т.е. (условно) на экран:

// Буфер верхнего уровня:
ob_start();

ob_start();
echo '<p>вывод второго буфера</p>';
ob_end_flush();

echo '<p>вывод первого буфера</p>';

ob_start();
echo '<p>вывод третьего буфера</p>';
ob_end_flush();

ob_end_flush();

Выведет следующее:

<p>вывод второго буфера</p>
<p>вывод первого буфера</p>
<p>вывод третьего буфера</p>

Обратите внимание: очерёдность вывода сохраняется. Теперь проведём такой эксперимент - "зарэжэм"основной буфер, т.е. тот который находиться на самом верху стека:

// Буфер верхнего уровня:
ob_start();

ob_start();
echo '<p>вывод второго буфера</p>';
ob_end_flush();

echo '<p>вывод первого буфера</p>';

ob_start();
echo '<p>вывод третьего буфера</p>';
ob_end_flush();

// Вот тут мы убили весь вывод.
ob_end_clean();

Теперь мы с вами ничего не увидим, потому что вложенные буферы извлекли своё содержимое в буфер верхнего уровня, а буфер верхнего уровня у нас закрылся функцией ob_end_clean() - которая накрыла весь вывод медным тазом.

Главное помнить, что буферы вывода работают в стеке, и всё будет ок.



Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 80 гостей онлайн