PHP: Буферизация вывода - Чтение буферов вывода

PHP: Буферизация вывода - Чтение буферов вывода

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

Чтение буферов вывода

Буфер вывода - штука двунаправленная, т.е. в него можно как писать (ударение на втором слоге! ), так и читать из него. Читать можно в переменную. Сделать это позволяет функция ob_get_contents()

ob_get_contents()

Эта функция не принимает параметров, и возвращает всё содержимое последнего открытого буфера:

ob_start();

echo 'Это какой то текст... много текста...';
// Получаем содержимое буфера в переменную:
$content = ob_get_contents();
// Чистим бфер
ob_end_clean();
// Пишем данные в файл:
file_put_contents('somefile.txt', $content);

Этот скрипт рассматривает выводимые данные, как сверх оперативную память и сохраняет их в файл, а не выводит пользователю.

Другие ob - функции

У механизма буферизации вывода есть ещё несколько полезных функций:

ob_get_length()

Не принимает никаких параметров, возвращает число - количество байт информации, хранимой в буфере. Бывает полезна, например при передаче HTTP - заголовка Contetnt-length.

ob_get_level()

Не принимает никаких параметров, возвращает число - уровень вложенности буфера. Вернёт 0, если вызвана вне какого - либо буфера. Бывает полезна, при реализации рекурсивного закрытия буферов, с передачей или без передачи данных в случае возникновения ошибки.

ob_get_handlers()

Не принимает никаких параметров, возвращает массив, содержащий дескрипторы вывода, которые работают на данный момент. Если буферизация включена - вернёт массив, в котором будет дескриптор по-умолчанию, если используется gzip сжатие буфера (об этом позже) то получим дескриптор "ob_gzhandler", а если используется замена URL то получим "URL-Rewriter".

Отправка выходных данных

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

for($i = 1; $i < 11; $i++ )
{	
	sleep(1);
	echo '

Это очередное обновление данных № '.$i.'

' ; flush(); }

результат:

<p>Это очередное обновление данных № 1</p>
<p>Это очередное обновление данных № 2</p>
...
<p>Это очередное обновление данных № 10</p>

При работе этого скрипта данные к клиенту будут уходить частями, с интервалом в 1 сек. И клиент в реальном времене будет видеть, как у него появляются новые данные.

В IE есть некий механизм "оптимизации" который отображает страницу только после получения первых 256 байт информации! Независимо от применения вами функции flush(). Так что имейте ввиду с "ишаком", как всегда могут быть проблемы, если ваш скрипт отправляет клиенту меньше 256 символов ( или примерно 128 символов кирилицы в юникоде ) .

Функция ob_implicit_flush() - избавляет вас от вызова каждый раз функции flush():

ob_implicit_flush();

for($i = 1; $i < 11; $i++ )
{	
	sleep(1);
	echo '

Это очередное обновление данных № '.$i.'

' ; }

Этот скрипт даст тот же эффект, что и скрипт выше.



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


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






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