7
votes

I see (not just on this site) a lot of question from inexperienced PHP programmers about the infamous "headers already sent... output started at" error, and many people suggest using ouput buffering as a solution.

In my experience I have never found a situation where that error wasn't caused by a flaw in the program's logic. Are there cases where output buffering is actually the correct solution?

5

5 Answers

5
votes

I would concur with your initial statement. Generally, solving "headers" problem with output buffering is a stopgap measure.

The really sad/funny part of this solution is: what happens when you want to output something large, such as a file you are keeping behind a paywall? Usually it results in people replacing the "headers" problem with their scripts running out of memory.

Whoops.

2
votes

The only situation I can imagine is a CMS or Weblog in which plugins can be invoked in the HTML code, like

<h1>My images</h1>
{plugin:show_images}

those plugins may have to add their own style sheets and other things that go in the <head> section of the page. Using buffering, this would be possible.

In practice though, this is not good for performance, feels kludgy and doesn't work when output buffering is turned off. Even here, it is therefore better to pre-process the contents before showing them, and doing any adding of style sheets etc. before anything is output.

0
votes

You might want to issue HTTP redirects late in the flow, for example in templates or exception handling. (Of course, a framework with templating or global exception handling would need output buffering anyway, so you could say it isn't a solution to this problem specifically.)

0
votes

In my experience I have never found a situation where that error wasn't caused by a flow in the program's logic. Are there cases where output buffering is actually the correct solution?

I'd have to agree with you, however:

1) One of the reasons I like PHP is because it lets you choose how you solve the problem

2) there are other uses for output_buffering other than fixing the 'Headers already sent' message - e.g. compressing output, capturing output of arbitary code, avoiding chunked encoding....

C.

0
votes

for template systems you will need ob_start ... look and Zend_View

Later Edit I misunderstood the question and provided a case where ob_start use is a valid solution.