[2003年05月29日 15:51 UTC] sthomas at townnews dot com
Please note that the manual says this:
"Turning implicit flushing on will disable output buffering, the output buffers current output will be sent as if ob_end_flush() had been called."
Now, I've set output_buffering = 0 in my php.ini script, so supposedly ob_implicit_flush will flush any buffers started by the script itself, and continue flushing output thereafter. Try this:
<?PHP
ob_start();
ob_implicit_flush(1);
while(1)
{
print "Hi!";
sleep(1);
}
?>
This script will not output "Hi!" after each iteration through the loop. Supposedly the documented behavior of ob_implicit_flush is to flush all output buffers once it's called, and disable output buffering for further statements that produce output (print, etc.)
So either the documentation is wrong, or there's a bug in ob_implicit_flush. You decide.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Implicit flush is turned off in the php.ini file, but that's only the default status. Calling ob_implicit_flush should enable autoflushing. The CLI *does* work if I set the output_buffering setting to 0, but here's the screwy part: Set it to any non-zero value, and flushing doesn't occur at all. Setting output_buffering to 1024 would imply that after 1024 characters are sent to the buffer, the buffer is sent to screen/browser. This is not the case. So not only is ob_implict_flush completely ignored when output_buffering is set to a non-zero value, but output_buffering doesn't flush after the designated value either. At least not with the CLI. But don't take my word for it. Set output_buffering to *anything* above 0, then run this script with the CLI: <?PHP ob_start(); ob_implicit_flush(1); while(1) { for ($i = 0; $i < 1024; $i++) print "."; flush(); sleep(1); } ?> You'll see that no flushing is taking place... at all. Even with an explicit call to flush(), and even though ob_implicit_flush says that output buffering should now be disabled. Yes ob_end_flush() works, however the PHP documentation says ob_implicit_flush does an implied call to ob_end_flush(). So either the documentation is wrong, or PHP is broken. If the documentation is wrong, why have ob_implicit_flush in the first place if it doesn't actually do anything? Because so far with recent versions of PHP, I haven't been able to create a single test case where ob_implicit_flush actually did anything.According to the manual: "ob_implicit_flush() will turn implicit flushing on or off. Implicit flushing will result in a flush operation after every output call, so that explicit calls to flush() will no longer be needed." This means that if I have registered a output-handler like this: function myhandler($str) { // handle $str internally } ob_start('myhandler'); ob_implicit_flush(true); Then according to the manual, each time I call "echo", "print" or output data outside PHP tags; it should call the ob_handler callback. This does not work in PHP CLI mode. If this is not expected to work, the manual should be updated. But this is a feature i really need, since i want to be able to let people write "print/echo" in their scripts, but my handler should preprocess the data. IMHO, it would have been really nice if this function worked as the documentation says. Either by actually automatically firing flush() on each echo/print/etc, or by implicitly calling the callback on each echo/print/etc.