`
xiaoqiang6775
  • 浏览: 31540 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 很熟悉的话,应该会判断出结果:直接输出了 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 的第一篇博客,以后会多多经营,请码友们多指教。

分享到:
评论

相关推荐

    关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解

    ob_start()使用ob_start()把输出那同输出到缓冲区,而不是到浏览器。然后用ob_get_contents得到缓冲区的数据。ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中...

    php中 ob_start等函数截取标准输出的方法

    我想将PHP脚本中输出的东西收集在一起,于是使用了ob_start和ob_end_flush这两个函数,确实有达到收集输出内容的作用,但同时也将这些打印到了控制台界面中。我想问的是有没有办法,阻止PHP像控制台输出信息。该软件...

    php基于ob_start(ob_gzhandler)实现网页压缩功能的方法

    下面的代码是一个压缩网页的例子,我们利用ob_gzip函数,使用ob_start将输出内容压缩后放到“缓冲区”后再输出 。 PHP代码 //启用压缩 if(function_exists('ob_gzip')) { ob_start('ob_gzip'); } //准备一些待压缩...

    解析PHP中ob_start()函数的用法

    ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行/都会有”Header had all ready send by”的错误,这时可以先用ob_start()打开缓冲区PHP代码的数据块和echo()输出都会进入缓冲区...

    PHP缓存技术详解 ob_start

    有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信 息.它是于服务器同生死的,我们在保存缓存的时候可以指定下次更新的时间...

    ob_start(),ob_start(ob_gzhandler)使用

    输出前使用尽量使用 ob_start();可以加快输出速度,适用NT 对unix类服务器 如果使用ob_start(‘ob_gzhandler’);输出效率将更高

    PHP生成静态页面(ob_start+smarty)生成

    转载个PHP生成静态页面学习的资料,希望对学习PHP生成静态页面的朋友有帮助。

    用php的ob_start来生成静态页面的方法分析

    在开始之前还是提一下三个函数吧:”ob_start()、ob_end_clean()、ob_get_contents()” ob_start():是打开缓冲区的,就是要把您需要生成的静态文件的内容缓存在这里; ob_get_contents():是读出缓冲区里的内容,下面...

    PHP中ob_start函数的使用说明

    用PHP的ob_start(); 控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 ...

    PHP用法ob_start生成html页面的方法_.docx

    PHP用法ob_start生成html页面的方法_.docx

    php利用ob_start()清除输出和选择性输出的方法

    下面小编就为大家分享一篇php利用ob_start()清除输出和选择性输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    php缓冲 output_buffering和ob_start使用介绍

    主要介绍了php缓冲 output_buffering和ob_start的相关资料,需要的朋友可以参考下

    php使用ob_start()实现图片存入变量的方法

    主要介绍了php使用ob_start()实现图片存入变量的方法,是对缓存的灵活运用,具有既定的参考借鉴价值,需要的朋友可以参考下

    用PHP ob_start()控制浏览器cache、生成html实现代码

    ob_start(); //打开缓冲区 echo “Hello\n”; //输出 header(“location:index.php”); //把浏览器重定向到index.php ob_end_flush();//输出全部内容到浏览器 ?&gt; 所有对header()函数有了解的人都知道,这个函数

    用PHP的ob_start();控制您的浏览器cache!

    【转载】原文地址:http://www.itbbs.cn/index.php?showtopic=1074 Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后...php ob_start(); //打开缓冲区 ech

Global site tag (gtag.js) - Google Analytics