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() - которая накрыла весь вывод медным тазом.
Главное помнить, что буферы вывода работают в стеке, и всё будет ок.
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.