Войти Регистрация

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


Зачем нужна буферизация вывода в PHP? Что это такое? Как ее реализовать? Ответы на эти вопросы вы найдете в нашей статье. Сейчас мы детально рассмотрим практическое применение php буферизации и посмотрим реальные примеры. Как и во всяком деле поставим для себя цели и будем их достигать понемногу:

Что такое php буферизация?

Как реализовать буферизацию вывода в PHP?

Где я могу применять буферизацию вывода?

PHP буферизация

Слово буферизация говорит само за себя, это значит, что мы что-то копируем, помещаем в буфер. В php, буферизация позволяет скопировать определенную часть выводимого контента (html) в браузер, обработать ее нужными нам функциями и показать его пользователю. Зачем это нам? Например, можно реализовать сжатие html кода, или замены некоторых сущностей на другие, да что угодно. Более детально рассмотрим применение php буферизации в последнем пункте статьи.

Реализация буферизации вывода в PHP

Буферизация начинается с функции ob_start([callback]);. После ее объявления буферизироваться будет все, что выводится в окно браузера. Аргумент callback это пользовательская функция, через которую можно пропустить и обработать выводимый текст, она должна возвращать одну строку.

ob_end_clean(); - завершает буферизацию и чистит буфер, но в браузер ничего не посылается.

Существует много функций для работы с буферизацией вывода в php. Сейчас посмотрим маленький практический пример для большей ясности дела. Например, у Вас генерируется страница, но при этом необходимо в тексте страницы заменить все буквы "ё" на буквы "е. Тогда делается примерно такое:

ob_start();

генерируется страница;

$page = ob_get_contents();

ob_end_clean();

$page = str_replace("ё", "е", $page);

echo $page;

Применение буферизации вывода

Рассмотрим некоторые практические стороны применения буферизации вывода. Как уже упоминалось, предположительно мы имеем часть выводимого html кода или весь выводимый код. Что же с ним можно сделать?

Реализация автообновления на вашем сайте.

Обновление в смысле обновление контента. Посмотрев лекции Каширина, я узнал, что для того, что-бы страничка сайта была обновляемой в глазах поискового робота, необходимо, что-бы 25% содержимого страницы поменялось коренным образом. В начале, я просто создавал блок анонса, который выводил 25% символов от статьи, блок был одним и тем же на всех страницах, обновлялся 1 раз в сутки, выбирался случайным образом из массы всех статей. Он выглядел таким образом:

 php буферизация

Но здесь была проблемка, одна статья была на 1500 символов, другая на 10000 символов, и если анонсом выбиралась та, что на 10000 символов, и анонс отображался на той статье в которой 1500 символов, то получалось что блок анонса составлял 5000 символов, это гораздо больше, нежели сама статья. Может, вы думаете, что нужно было, узнать количество символов исходной статьи и вывести в 4 раза меньше в анонсе. Я тоже так думал, но есть еще много факторов, таких как комментарии, новости сайта… В общем, нужно было знать количество символов всей странички, в этом мне помогла php буферизация или php буферизация вывода, называйте как хотите. Ниже код как я это реализовал.

<?

 ob_start('len'); // на самом верху кода выводимой странички

?>

  // Текст странички после <body> … в общем вся страница до того места где нужно вставить блок анонса

<?

function len($buffer)

{

include('anons.php');

return $buffer.$show_anons;

} 

ob_end_flush(); ?>

В файле anons.php, узнаем количество символов контента страницы без html тегов используя функции strip_tags() и strlen(). Далее дело техники, вычисляем блок анонса, его html код пишем в $show_anons и прицепляем после буферизированного контента ($buffer). Вот так вот мне помогла буферизация вывода в php. Ниже, скриншоты блока анонса, написанного с помощью использования php буферизации.

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

Вполне приличные блоки анонсов. Автообновление странички организовано, кричу УРА php буферизации.

Сжатие html кода

Об этом у меня есть отдельно написанная статья: сжатие html кода, но я предоставлю пример php кода, в нем тоже используется PHP буферизация.

<?php

                //  старт буферизации выводимого

                ob_start('compress_html');

?>

<!--Здесь находиться html код  -->

<?php

                // конец буферизации и вывод сжатого html кода

                ob_end_flush();

                //  Эта функция избавляется от переносов, пробелов и т.д.

                function compress_html($compress)

                {

                               $i = array('/>[^S ]+/s','/[^S ]+</s','/(s)+/s');

                               $ii = array('>','<','1');

                               return preg_replace($i, $ii, $compress);

                }

?>

Другие варианты

Как видите применению буферизации вывода в php, нет предела. Наверняка у вас уже появились свои идеи, как реализовать те или иные штучки на своем сайте. Спасибо за внимание, надеюсь моя статья была вам полезной. Кстати, если имеете еще идеи по поводу применения php буферизации, пишите в комментариях ниже. 



Дальше: Отправка формы с помощью Ctrl + Enter на javascript


Дискуссия по теме     3 Комментария 
Добавить комментарий
Tatiana 31.01.2016 в 19:24
Здравствуйте, скажите, пожалуйста, что значит вот такая ошибка: Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0 Из-за чего она могла появиться, и как ее исправить. Заранее благодарю.
Aricus 14.04.2014 в 01:23
Буферизация всего php кода помогла избавиться от ошибки: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent Правда, я так и не понял, каким образом.
Иван 19.02.2012 в 15:32
Спасибо, всё понятно!
Просмотров: 12148