Необходимо начать генерацию вывода раньше, чем закончится пересылка заголовков или 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.