php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #23877 ob_implicit_flush does not work
Submitted: 2003-05-29 15:51 UTC Modified: 2013-07-30 19:19 UTC
Votes:49
Avg. Score:4.0 ± 1.0
Reproduced:36 of 37 (97.3%)
Same Version:4 (11.1%)
Same OS:10 (27.8%)
From: sthomas at townnews dot com Assigned: mike
Status: Not a bug Package: CGI/CLI related
PHP Version: 4.3.2 OS: Redhat Linux
Private report: No CVE-ID:
 [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.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-06-29 21:07 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

You should've used ob_end_flush(); instead of ob_implicit_flush();.
 [2003-06-30 08:02 UTC] sthomas at townnews dot com
So... did you read the report at all?  Did you see the part where I quoted the PHP documentation?  Let me do it again:

"Turning implicit flushing on will disable output buffering, the output buffers current output will be sent as if ob_end_flush() had been called."

Therefore, according to this, calling ob_implicit_flush *IMPLIES A CALL TO OB_END_FLUSH*! What part of YOUR OWN DOCUMENTATION do you not understand?  Either the documentation is wrong, or PHP is wrong.  Whichever it is, fix it so there's at least some consistancy.
 [2003-06-30 09:33 UTC] mgf@php.net
There's a second level of buffering after the ob_ buffering.  What is your implicit_flush setting?  Please also refer to http://www.php.net/flush
 [2003-06-30 11:05 UTC] sthomas at townnews dot com
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.
 [2004-07-22 11:16 UTC] everyone at example dot com
Look dude, you don't have to be so damn obnoxious about it. Be a bit more polite and you will get a more favorable response.
 [2005-07-19 14:40 UTC] jeff at tillwicks dot us
I agree with sthomas totally on this.  I have been promised that there is a way to get the output preformance of perl with php using output buffering and flush.  I use the cli version and have yet to get it working once.  I have followed every example (copy and pasted exact) that is featured in php's own documentation.  With every attempt all data is sent after the entire page has finished loading.  It is just lack of support on this issue.
 [2009-11-11 22:59 UTC] haakon at avelia dot no
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.
 [2011-01-01 01:32 UTC] jani@php.net
-Package: Feature/Change Request +Package: CGI related
 [2013-07-30 19:19 UTC] mike@php.net
-Status: Open +Status: Not a bug -Assigned To: +Assigned To: mike
 [2013-07-30 19:19 UTC] mike@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

"output call" does not refer to echo/print but to a call to the SAPI's module 
ub_write function.
 [2013-08-08 17:56 UTC] valentiny510 at yahoo dot es
Aleluya Mike, Thank you... (just hope that sthomas did't died after all this time :)
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Fri Apr 25 07:02:14 2014 UTC