Yes
Serious web applications need output buffering in one specific situation:
Your application wants control over what is output by some 3rd-party
code, but there is no API to control what that code emits.
In that scenario, you can call ob_start()
just before handing
control to that code, mess around with what is written (ideally with
the callback, or by examining the buffer contents if you must), and
then calling ob_flush()
.
Ultimately, PHPs' ob_functions are a mechanism for capturing what some other bit of code does into a buffer you can mess with.
If you don't need to inspect or modify what is written to the buffer, there is nothing gained by using ob_start()
.
Quite likely, your 'serious application' is in fact a framework of some kind.
You already have output buffering, anyway
You don't need ob_start()
in order to make use of output buffering. Your web-server already does buffer your output.
Using ob_start()
does not get you better output buffering - it could in fact increase your application's memory usage and latency by 'hoarding' data which the web-server would otherwise have sent to the client already.
Maybe ob_start()
...
... for convenience when flushing
In some cases, you may want control over when the web-server flushes its buffer, based on some criteria which your application knows best. Most of the time, you know that you just finished writing a logical 'unit' which the client can make use of, and you're telling the web-server to flush now and not wait for the output buffer to fill up. To do this, it is simply necessary to emit your output as normal, and punctuate it with flush()
.
More rarely, you will want to withhold data from the web-server until you have enough data to send. No point interrupting the client with half of the news, especially if the rest of the news will take some time to become available. A simple ob_start
later concluded by an ob_end_flush()
may indeed be the simplest and appropriate thing to do.
... if you have responsibility for certain headers
If your application is taking responsibility for calculating headers which can only be determined after the full response is available, then it may be acceptable.
However, even here, if you can't do any better than deriving the header by inspecting the complete output buffer, you might as well let the web-server do it (if it will). The web-server's code, is written, tested, and compiled - you are unlikely to improve on it.
For example, it would only be useful to set the Content-Length
header if your application knows the length of the response body after before it computes the response body.
No panacea for bad practices
You should not ob_start()
to avoid the disciplines of:
- opening, using and quickly closing resources such as memory, threads and database connections
- emitting headers first, and the body second
- doing all the calculations and error handling you can, before beginning the response
If you do these, they will cause technical debt which will make you cry one day.