Could someone please save these 2 files and run them and tell me why I get the error ” ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush”. I tried googling around and it says that I have to use ob_start(); but when I do then it doesn’t print out line by line, but rather returns the whole object from the FOR loop when it has completed. I’m kinda new to PHP so I’m not sure where else to look..
test_process.php
// This script will write numbers from 1 to 100 into file // And sends continuously info to user $fp = fopen( '/tmp/output.txt', 'w') or die('Failed to open'); set_time_limit( 120); ignore_user_abort(true); for( $i = 0; $i < 100; $i++){ echo "<script type="text/javascript">parent.document.getElementById( 'foo').innerHTML += 'Line $i<br />';</script>"; echo str_repeat( ' ', 2048); flush(); ob_flush(); sleep(1); fwrite( $fp, "$in"); } fclose( $fp);
main.html
<html> <head> <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript" charset="utf-8"></script> <style type="text/css" media="screen"> .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid} .new{ background-color:#3B9957;} .error{ background-color:#992E36;} </style> </head> <body> <iframe id="loadarea" width="1024px" height="768px"></iframe><br /> <script> function helper() { document.getElementById('loadarea').src = 'test_process.php'; } function kill() { document.getElementById('loadarea').src = ''; } </script> <input type="button" onclick="helper()" value="Start"> <input type="button" onclick="kill()" value="Stop"> <div id="foo"></div> </body> </html>
Advertisement
Answer
I think you are confusing ob_flush()
with flush()
. While ob_start()
and ob_flush()
handles a PHP internal output buffer that catches all outputs, flush()
is the normal function that flushes STDOUT
like in other programming languages.
Example:
<?php ob_start(); echo "FoobarnFoobarnFoobarn"; // Nothing printed yet ob_flush(); // Now it is printed. echo "Foobarn"; // Printed directly, because contains a line ending. echo "Foobar"; // Not printed, because normally buffers are flushed on line endings flush(); // Printed.
EDIT:
Your output is not printed, because your webserver may buffer the contents. Try to turn off compression and output buffering:
@apache_setenv('no-gzip', 1); @ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1);
Please also keep in mind, that Safari and Internet Explorer have an internal 1K buffer. So you need to add 1 KB of padding data (like spaces), to make them render.
EDIT 2: Your implementation is broken. You want to poll your data with ajax. Use jQuery on the client side:
<div id="counter">0%</div> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"> <script type="text/javascript"> function doPoll(){ $.post('script-that-returns-stuff.php', function(data) { $("#counter").html(data); setTimeout(doPoll,5000); }); } doPoll(); </script>
Then in script-that-returns-stuff.php
:
<?php $file = explode("n", file_get_contents("/tmp/output.txt")); $last_line = $file[count($file)-1]; echo $last_line."%";