日期:2014-05-17  浏览次数:20511 次

flush()函数有时好像不起作用
下面这个程序是我在网上找的,他注释中说第一句非常关键,可我发觉第一句根本没起作用,没有输出300个空格。而且我把第一句删了运行结果完全相同,这是为什么啊
<?php
for($i = 1; $i <= 300; $i++ ) print(" ");
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出
// 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经
// 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会
// 源源不断的被发送出去。
For($j = 1; $j <= 20; $j++) {
echo $j." ";
flush(); //这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚
}
?>

我自己写了个程序,我发现把ob_flush()改成flush()后,第一条就不输出了,我记得flush()是立即输出缓冲区的内容啊,为什么不输出呢。
ob_end_flush();好像和ASP中的response.end也不同哦,ob_end_flush();后,后面的内容仍然会输出啊,有什么办法让后面的内容停止输出不


<? 
ob_start();
echo "第一条";
ob_flush() ; //立刻输出缓冲区中的内容
echo "第二条";
ob_get_clean() ; //清除缓冲区中的内容
echo "第三条" ;
ob_end_flush();
?>

------解决方案--------------------
只有 IE 才有缓冲区装满或传输结束才解释传入的内容的现象
空格不是 HTML 元素,无论多少个,也只会显示一个

flush() 的作用是将 php 系统缓冲区的内容推出到客户
ob_flush() 的作用是将 php 用户缓冲区的内容推出到 php 系统缓冲区
ob_end_flush() 的作用是将 php 用户缓冲区的内容推出到 php 系统缓冲区,并关闭 php 用户缓冲区
ob_end_clean() 的作用是将 php 用户缓冲区的内容清空,并关闭 php 用户缓冲区

response 采用的是完全不同的机制(response 是设备)
只有在 ob_start() 后的 ob_end_clean() 才相当于 response.end

------解决方案--------------------
系统缓冲区 是指php的输出缓冲区,可用 output_buffering 控制其大小
每当 php 程序有输出时将存放在里边,待装满了或程序结束时一次性发送给用户
flush() 就是强制输出他里面的内容

用户缓冲区 是指用 ob_start() 开辟的缓冲区,每个 ob_start() 就是一个,允许嵌套
------解决方案--------------------
你试下这段代码,我在ie,firefox,chrome下都没问题。
<?php
echo str_pad('',4096);

set_time_limit(50);
for($i=0;$i<=5;$i++){
    echo $i.'<br />';
ob_flush();
flush(); 
sleep(1);
}
?>

------解决方案--------------------
关于服务器端推送数据客户端即时显示的问题,其实是会受到web服务器,浏览器,以及代码三个方面的影响。

你要先明白整个流程:
web服务器也有缓冲区buffer,这个buffer的大小,会关系到服务器字节数到达多少后再推送给客户端浏览器。
然后浏览器也会有个buffer,收到多少字节后才显示出来。
你那段代码只是填充一些空白来欺骗浏览器让浏览器把内容即时显示出来。而问题可能在服务器端那边,根本没把数据发到客户端来。

对于服务器如何设置,apache貌似默认设置就可以。
nginx需要关闭gzip,然后设置fastcgi_buffers,fastcgi_buffer_size等值才行。具体你自己再查一下吧。

另外不同浏览器对于缓冲区buffer的规定也不一样,要想实现多种浏览器支持,你就尽量填大一些吧。
------解决方案--------------------
iis magager - system.webServer/handlers responseBufferLimit设为0, 
php.ini - output_buffer =Off