Hi Please View Below Code :
<?php
ob_start();
echo "Start ...<br />\n";
for( $i = 0 ; $i < 10 ; $i++ )
{
echo "$i<br />\n";
ob_flush();
flush();
sleep(1);
}
echo "End ...<br />\n";
?>
It's Incorrect ? i'm tested it but my output show when script is done, have any solution ?
Hey man I was also got stuck in this problem and finally got the correct solution here it is for you
you have to add content type for your page you can do that by two ways 1. using html tag
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Ex.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wp Migration</title>
</head>
<body>
<?php
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
</body>
</html>
using php header function
<?php header( 'Content-type: text/html; charset=utf-8' ); ?>
Ex.
<?php
header( 'Content-type: text/html; charset=utf-8' );
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
All the best
Some browsers need to receive at least 256 characters before they start to render. Have you already tried to stuff more output like:
echo str_repeat(' ', 50) . "$i<br />\n";
EDIT:
Under Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9
I was able to reproduce the problem of the OP by setting
zlib.output_compression = On
Turning it off again by
zlib.output_compression = Off
made the script work as wanted.
Try removing the call to ob_start()
on your first line : there is no need for you to enable output buffering -- and it probably causes troubles, here.
I've tested your code :
- If
ob_start()
is called on the first line, I only see the output when the script finishes, after 10 seconds - If I remove that call to
ob_start()
, then, I see one line of output every second, as soon as it's displayed on the standard output.
Using Chrome, I found out that many more bytes are required to by-pass the browser's buffer. In my case 4096 bytes was fine:
echo str_repeat(' ', 4096);
Also, adding some HTML element at the beginning also seemed to be mandatory:
echo $content . '<br />';
On my system it appears that FF4 needs more than 256 bytes to start rendering what is arriving from the server side, then i resolved with this at the beginning:
while (@ob_end_flush());
echo(str_repeat(' ',1024));
// ...etc...
I've discovered that this was due to Apache's gzip compression being in use for my case.
To turn gzip off for the 'flushing' script only, I created a new .htaccess
file in the directory where the continuous output script resides, with the following:
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>
Flushing is working as expected again.
For people using FCGI / fast cgi.
FcgidOutputBufferSize 0
It is correct. Works fine for me from CLI running PHP 5.3.3. If it's not working for you, your PHP install may have output buffering disabled.
I would also suggest putting ob_end_flush() at the end of your script to close the output buffer.
One sneaky issue with IE8 and flush(); is that if you're "flushing" out rows in a table. IE will only display tables when they're complete. This was my issue, and changing containers from table rows to divs solved the problem.
You need to add a .htaccess
file to disable gzip output
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>
I am using laravel framework and buffering did not work but. This is solution :
header( 'Content-type: text/html; charset=utf-8' );
ob_start();
ob_end_flush();
ob_flush();
flush();
for($i = 1;$i<= 5;$i++){
echo $i;
ob_flush();
flush();
sleep(3);
}
You have to use first ob_end_flush();
This flow works with Laravel too
ob_implicit_flush(true);
echo "Processing ... "; // Or give out JSON output
ob_flush();
sleep(5); //A time-consuming synchronous process (SMTP mail, maybe?)
echo "Done";
来源:https://stackoverflow.com/questions/5770917/calling-ob-flush-and-flush-yet-browser-doesnt-show-any-output-until-script