Use case for output buffering as the correct solution to “headers already sent”

前端 未结 5 562
无人及你
无人及你 2020-12-11 17:10

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 su

相关标签:
5条回答
  • 2020-12-11 17:49

    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 讨论(0)
  • 2020-12-11 17:52

    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.

    0 讨论(0)
  • 2020-12-11 17:54

    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 讨论(0)
  • 2020-12-11 18:05

    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.

    0 讨论(0)
  • 2020-12-11 18:09

    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 讨论(0)
提交回复
热议问题