php ob_start输出缓冲区是可堆叠性探究

关于 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 很熟悉的话,应该会判断出结果:直接输出了 01234 ;有人很奇怪为什么会出现这个情况,而不是 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);
}
?>
 

 

结果是先输出了 01234 然后每 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 所以先输出了 01234 然后每 sleep 1s 输出一个数字。

这个算是迎接 2013 的第一篇博客,以后会多多经营,请码友们多指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值