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 going directly to output. For example:

    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:

    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 the following script:

    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 and 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 favor—you can progressively build up your content by opening up new buffers and flushing in content to a parent buffer as you go.

Get PHP in a Nutshell now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.