Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

Необходимо начать генерацию вывода раньше, чем закончится пересылка заголовков или cookies.

Решение

Вызовите функцию ob_start() в начале вашей страницы и функцию ob_end_flush() в конце страницы. Кроме того, можно поменять местами команды, генерирующие код, и команды, посылающие заголовки. Выходная информация не будет послана до тех пор, пока не будет вызвана функция ob_end_flush():

<?php ob_start(); ?>

I haven't decided if I want to send a cookie yet.

<?php setcookie('heron','great blue'); ?>

Yes, sending that cookie was the right decision.

<?php ob_end_flush(); ?>

Обсуждение

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

<?php
function mangle_email($s) {
     return preg_replace('/([^@\s]+)@([-a-z0-9]+\.)+[a-z]{2,}/is',
               '<$1@...>',
               $s);

}

ob_start('mangle_email');
?>

I would not like spam sent to ronald@example.com!

<?php ob_end_flush(); ?>

Функция mangle_email() преобразует вывод в:

I would not like spam sent <to ronald@...>!

Параметр конфигурации output_buffering включает буферизацию вывода для всех страниц:

output_buffering = On

Точно так же параметр output_handler устанавливает функцию обратного вызова для обработки буфера вывода, которая будет использована на всех страницах:

output_handler=mangle_email

Установка параметра output_handler автоматически устанавливает параметр output_buffering в on.

См. также

Документацию по функции ob_start() на http://www.php.net/ob-start, по функции ob_end_flush() на http://www.php.net/ob-end-flush и по буферизации вывода на http://www.php.net/outcontrol.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ