论坛首页 编程语言技术论坛

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

浏览 1843 次
精华帖 (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 的第一篇博客,以后会多多经营,请码友们多指教。

   发表时间:2013-01-04  
多谢分享!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics