客户端的请求到web服务器,web服务器再调用PHP代码;
PHP返回内容到web服务器,web服务器再返回给客户端
边执行边输出就需要web服务器和PHP都不缓存内容
首先, Nginx不缓存PHP返回的内容
header('X-Accel-Buffering: no');//关闭nginx的缓存
其次,PHP不缓存,PHP不缓存有两种方式,
注意: 不缓存也不是直接输出到客户端,而是转为等待输出,需要调用flush()
一是修改配置文件php.in,修改output_buffering为0或Off 默认是4096(K)
output_buffering = 0
;或者
output_buffering = Off
二是PHP代码中关闭
ob_end_flush();
//或者
ob_end_clean(); //与ob_end_flush类似,
//二者区别: 在下次调用flush的时候, ob_end_clean不会输出在他之前echo/print的内容, 而ob_end_flush会
三是获取buffer中的内容进行输出
ob_flush()
最后展示
header('X-Accel-Buffering: no');//关闭nginx的缓存
echo 'begin...<br>';
//方式1
ob_end_flush();//关闭缓存 数据不再存储到buffer区域中,变为等待输出状态
for($i = 1; $i <= 3; $i++)
{
echo 'loading '.$i.'0%<br>';
flush();//将等待输出的数据立刻输出到客户端
sleep(1);
}
//方式2
ob_end_flush();//关闭缓存 数据不再存储到buffer区域中,变为等待输出状态
ob_implicit_flush(1);//打开绝对(隐式) 刷送。每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。
for($i = 1; $i <= 3; $i++)
{
echo 'loading '.$i.'0%<br>';
sleep(1);
}
//方式3
for($i = 1; $i <= 3; $i++)
{
echo 'loading '.$i.'0%<br>';
ob_flush();//获取缓存区的内容,转为等待输出状态
flush();//将等待输出的数据立刻输出到客户端
sleep(1);
}
apache需要更改httpd.conf 的 FcgidOutputBufferSize 0
参考文章: