锁定老帖子 主题:php 输出缓冲区是可堆叠性探究
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-12-29
关于 ob_start 的作用在此不做过多描述,网上很多。 请看下面的小程序 ( 在看之前,说明一下,在 php.ini 中设置 output_buffering=on) <?php ob_start(); echo str_repeat(' ', 1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了 for ($i = 0; $i < 5; $i++) { echo $i . '<br />'; ob_flush(); flush(); sleep(1); } ?>
如果对 ob_start 很熟悉的话,应该会判断出结果:直接输出了 0 、 1 、 2 、 3 、 4 ;有人很奇怪为什么会出现这个情况,而不是 sleep 1s 后输出一个。这个暂不解释,在看一下下面这个程序: <?php ob_start(); echo str_repeat(' ', 1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了 for ($i = 0; $i < 5; $i++) { echo $i . '<br />'; ob_flush(); flush(); sleep(1); } ob_end_flush(); for ($i = 0; $i < 5; $i++) { echo $i . '<br />'; ob_flush(); flush(); sleep(1); } ?>
结果是先输出了 0 、 1 、 2 、 3 、 4 然后每 sleep 1s 输出一个数字。 因为, ob_start 函数是有堆叠性的,也就是说, ob_start 一般要和 ob_end_flush 配合使用。 先说一下第一个程序,在 php 配置文件内已经开启了 output_buffering 暂且编号 1 ,在程序中又因为 ob_start 的原因开启了另一缓冲区暂且编号 2 (请明白是缓冲区 buffering ,而不是 cache ),因为 ob_flush 是刷新 php 缓冲区,而不是关闭,所以,每 sleep 1s 只是刷新了缓冲区 2 ,所以会等待输出结束或者超过 buffering 的值时才会输出。而第 2 个程序因为关闭了一个 cache 所以先输出了 0 、 1 、 2 、 3 、 4 然后每 sleep 1s 输出一个数字。 这个算是迎接 2013 的第一篇博客,以后会多多经营,请码友们多指教。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-01-04
多谢分享!
|
|
返回顶楼 | |
浏览 1847 次