1. ';
  2. sleep(2);
  3. }
  4. ?>
复制代码

运行结果:等所有脚本全部运行完成后,才输出,因为数据未满一个buffer的大小。

例2,output_buffering=4096,输出较少的数据(少于一个buffer),关闭output_buffering,修改

  1. '; // 当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
  2. flush();
  3. sleep(1);
  4. }
  5. ?>
复制代码

运行结果:因为禁用了 tcp buffer ->browser

例3,当output_buffering=4096,输出较大数据(大于一个buffer),不使用ob_start()

  1. ';
  2. sleep(1);
  3. }
  4. ?>
复制代码

运行结果:f.txt为一个大于4kb的文件,因为大于buffer默认值,buffer空间不够用,每当满一个buffer就会输出,所以可以看到间歇性输出。

例4,当output_buffering=4096,输出较大数据(大于一个buffer),使用ob_start()

  1. for($i=0; $i echo file_get_contents('f.txt').$i.'
    ';
  2. sleep(1);
  3. }
  4. ?>
复制代码

运行结果:因为使用了ob_start(),会为buffer设置足够大的空间,因此会保存到脚本执行完毕后才会输出。

output_buffering 方法1.ob_start激活output_buffering机制,一旦激活,脚本不再直接输出到浏览器,而是暂时写入

2.ob_get_contents获取

3.ob_end_flush 和 ob_end_cleanob_end_flush 会输出

注意:ob_flush/flush在手册中的描述,都是刷新输出缓冲区,并且还需要配套使用。其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情。

ob_*系列函数, 是操作

而flush, 严格来讲, 这个只有在

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。

例如,Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到

标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

正确的使用顺序为:先ob_flush,后flush。当然,在其他sapi下,不调用flush也可以,只不过为了保证代码的可移植性,建议配套使用。



09-18 13:48