What’s the difference between ob_flush() and flush() and why must I call both?
The ob_flush() reference says:
This function will send the contents of the output buffer (if any).
The flush() reference says:
Flushes the write buffers of PHP and whatever backend PHP is using (CGI, a web server, etc).
However, it continues to say:
[it] may not be able to override the buffering scheme of your web server…
So, seems to me that I could just use ob_flush() all of the time. However, I get strange results when I do that. Could someone explain in simple terms what’s going on here?
ob_flushsends an application-initiated buffer. There may be multiple nestedob_start()‘s in any PHP script.ob_flushpasses the current content to the upper layer.PHP itself might (at its own discretion) buffer output. This depends on the back-end. But usually
FastCGIhas a socket buffer on its own. Thereforeflush()needs to be invoked as well to send the current content to the web server.And now the web server might itself implement another buffering scheme (
mod_deflateor content filter), which you have no influence over. But this is seldom, as it needs to be configured specifically.Anyway, use both.