8.12. Buffering Output to the Browser
Problem
You want to start generating output before you’re finished sending headers or cookies.
Solution
Call ob_start( )
at the top of your page and
ob_end_flush( )
at the bottom. You can then intermix commands
that generate output and commands that send headers. The output
won’t be sent until ob_end_flush( ) is called:
<?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(); ?>Discussion
You can pass ob_start( ) the name of a callback
function to process the output buffer with
that function. This is useful for postprocessing all the content in a
page, such as hiding email addresses from address-harvesting
robots:
<?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(); ?>The mangle_email( )
function transforms the output to:
I would not like spam sent to <ronald@...>!
The
output_buffering
configuration directive
turns output buffering on for all pages:
output_buffering = On
Similarly,
output_handler
sets an output buffer
processing callback to be used on all pages:
output_handler=mangle_email
Setting an output_handler automatically sets
output_buffering to on.
See Also
Recipe 10.11 uses output buffering in a database error logging function; documentation on ...