background image

sleep(

$i

 + 1);

}
ob_end_flush();
?>
 
现象:直到服务端脚本处理完成,响应结束,才看到完整输,输出间隔时间很短,以至你
感受不到停顿。在输出之前,浏览器一直保持着空白界面,等待服务端数据。这是因为,
php 一旦调用了 ob_start()函数,它会将 php buffer 扩展到足够大,直到 ob_end_flush 函数
调用或者脚本运行结速才发送 php buffer 中的数据到客户端浏览器。
 
output buffering 函数
1.ob_get_level
返回输出缓冲机制的嵌套级别,可以防止模板重复嵌套自己。
1.ob_start
激活 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 中的数据压缩后再传送给浏览器。
 
2.ob_get_contents
获取一份 php buffer 中的数据拷贝。值得注意的是,你应该在 ob_end_clean()函数调用之前
调用该函数,否则 ob_get_contents()返回一个空字符中。
 
3.ob_end_flush 与 ob_end_clean
这二个函数有点相似,都会关闭 ouptu_buffering 机制。但不同的是,ob_end_flush 只是把
php buffer 中的数据冲(

flush

/send)到客户端浏览器,而 ob_clean_clean 将 php bufeer 中的数

据清空(erase),但不发送给客户端浏览器。ob_end_flush 调用之后,php buffer 中的数据依
然存在,ob_get_contents()依然可以获取 php buffer 中的数据拷贝。而 ob_end_clean()调用之
后 ob_get_contents()取到的是空字符串,同时浏览器也接收不到输出,即没有任何输出。
 
惯用案例
常常在一些模板引擎和页面文件缓存中看到 ob_start()使用。下面湿 CI 中加载模板的程序
代码: