Flushing stacked buffers

When you have no output buffers open, any text you print out goes straight to your user. When you have an output buffer, that text is stored away until you choose to flush it. When you have stacked output buffers, your buffers flush data up one level as opposed to directly to output. Consider the following script:

<?php
    ob_start();
    print "In first buffer\n";

    ob_start();
    print "In second buffer\n";
    ob_end_flush();

    print "In first buffer\n";
    ob_end_flush();
?>

That will output the following text:

In first buffer
In second buffer
In first buffer

As you can see, the second buffer gets flushed into the first buffer where it was left off, as opposed to directly to output - it literally gets copied into the parent buffer. Take a look at this following script:

<?php
    ob_start();
    print "In first buffer\n";

    ob_start();
    print "In second buffer\n";
    ob_end_flush();

    print "In first buffer\n";
    ob_end_clean();
?>

It is the same as the previous script, with the only difference being the last line - ob_end_clean() is used rather than ob_end_flush(). That script outputs nothing at all, because the second buffer gets flushed into the first buffer, then the first buffer gets cleaned, which means the clients receives none of the text.

As long as you keep in mind that output buffers are stacked, not parallel, this functionality will work in your favour - you can progressively build up your content by opening up new buffers and flushing in content to a parent buffer as you go.

 

Want to learn PHP 7?

Hacking with PHP has been fully updated for PHP 7, and is now available as a downloadable PDF. Get over 1200 pages of hands-on PHP learning today!

If this was helpful, please take a moment to tell others about Hacking with PHP by tweeting about it!

Next chapter: Reading buffers >>

Previous chapter: Stacking buffers

Jump to:

 

Home: Table of Contents

Copyright ©2015 Paul Hudson. Follow me: @twostraws.