<?php
for($i=0;$i<20;$i++)
{
echo 'printing...<br />';
ob_flush();
flush();
usleep(300000);
}
?>
Run Code Online (Sandbox Code Playgroud)
包含以下代码的网址:http://domainsoutlook.com/sandbox/delayed.php
我有一个专用服务器,所以我可以进行更改.我正在运行apache和nginx作为代理服务器.
Rog*_*ger 39
这就是我发现的:
Flush在Apache的mod_gzip或Nginx的gzip下不起作用,因为从逻辑上讲,它正在压缩内容,为此,它必须缓冲内容以对其进行gzip.任何类型的Web服务器gzipping都会影响这一点.简而言之,在服务器端,我们需要禁用gzip并减少fastcgi缓冲区大小.所以:
在php.ini中:
.output_buffering =关闭
.zlib.output_compression =关闭
在nginx.conf中:
.gzip off;
.proxy_buffering off;
也有这些线,特别是如果你没有访问php.ini:
@ini_set( '要用zlib.output_compression',0);
@ini_set( 'implicit_flush',1);
@ob_end_clean();
参数或者set_time_limit(0);
最后,如果你有它,请在下面编写代码:
ob_start( 'ob_gzhandler');
使用ob_flush();
PHP测试代码:
ob_implicit_flush(1);
for($i=0; $i<10; $i++){
echo $i;
//this is for the buffer achieve the minimum size in order to flush data
echo str_repeat(' ',1024*64);
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
小智 11
主要的php文件;
<?php
header('Content-Type: text/HTML; charset=utf-8');
header( 'Content-Encoding: none; ' );//disable apache compressed
session_start();
ob_end_flush();
ob_start();
set_time_limit(0);
error_reporting(0);
..... bla bla
for(each)........
{
bla bla..
echo "<br>>>>".$i."<<<br>";
ob_flush();
flush(); //ie working must
}
?>
Run Code Online (Sandbox Code Playgroud)
它正在工作..
sch*_*der 10
你ob_flush没有使用ob_start,所以没有什么可以冲洗它.
它还取决于Web服务器和代理及其设置.
您应该为Nginx禁用缓冲(将"proxy_buffering off;"添加到配置文件并重新启动Nginx)
另外,检查你的php.ini是否包含"output_buffering = Off"和"zlib.output_compression = Off".
您必须填充缓冲区,以便将其刷新到浏览器。在 echo 之后使用这个
echo str_pad('',4096)."\n";
Run Code Online (Sandbox Code Playgroud)
完整代码:
<?php
if (ob_get_level() == 0) ob_start();
for( $i=0 ; $i<20 ; $i++) {
echo 'printing...<br />';
echo str_pad('',4096)."\n";
ob_flush();
flush();
usleep(300000);
}
ob_end_flush();
?>
Run Code Online (Sandbox Code Playgroud)