background image

缓存中的内容取出来,

设置为等待输出状态,但不会直接发送到客户端

 ,这时你就需要

 

先使用 ob_flush()再使用 flush(),客户端才能立即获得脚本的输出。
一. flush 和 ob_flush 的正确顺序,正确应是,先 ob_flush 再 flush

 

,如下:

ob_flush();
flush();
如果 Web 服务器的操作系统是 windows 系统,那顺序颠倒或者不使用 ob_flush()也不会出
现问题。但是在 Linux 系统上就无法刷新输出缓冲。

output buffering 函数

1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

激活 output_buffering 机制。一旦激活,脚本输出不再直接出给浏览器,而是先暂时写入
php buffer 内存区域。
php 默认开启 output_buffering 机制,只不过,通过调用 ob_start()函数据 output_buffering 值

   

扩展到足够 大 。也可以指定$chunk_size 来指定 output_buffering 的值。$chunk_size 默认值
是 0,表示直到脚本运行结束,php buffer 中的数据才会发送到浏览器。如果你设置了
$chunk_size

 

的大小 ,则表示只要 buffer 中数据长度达到了该值,就会将 buffer

 

中 的数据

发送给浏览器。
当然,你可以通过指定$ouput_callback,来处理 buffer 中的数据。比如函数 ob_gzhandler,
将 buffer 中的数据压缩后再传送给浏览器。
第三个参数:是否擦除缓存,可选,默认是 true,如果设置为 false,则在脚本执行结束
前,缓存都不会被清除。

2.ob_get_contents

获取一份 php buffer 中的数据拷贝。值得注意的是,你应该在 ob_end_clean()函数调用前调
用该函数,否则 ob_get_contents()返回一个空字符中。

可以使用 ob_get_contents()以字符串形式获取服务端缓存的数据,
使用 ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。
而使用 ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。

服务端的缓存是堆叠起来的,也就是说你在开启了 ob_start()后,关闭之前,在其内部还 
可以开启另外一个缓存 ob_start()。

不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。

 

ob_start() 可以指定一个回调函数来处理缓存数据,如果一个 ob_start()内部嵌套了另一个
ob_start(),我们假定,外层的 ob_start(),编号是 A,内层的 ob_start()编号是 B,它们各自
制定了一个回调函数分别是 functionA 和 functionB,那么在缓存 B 中的数据输出时,它会
先辈 funcitonB 回调函数处理,再交给外层的 functionA 回调函数处理,之后才能输出到
客户端。

另外,手册说,对于某些 web 服务器,比如 apache,在使用回调函数有可能会改变程序
当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用 chdir 函数,
这点似乎不常遇到,遇到的时候记得去查手册吧。