欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

ob_flush ob_start() 有大用

shiping1 的头像
 此功能将发送输出缓冲区的内容(如有)。如果你想进一步处理缓冲区的内容,
 你作为缓冲区的内容丢弃后ob_flush()之前调用ob_flush()ob_get_contents()被调用。
 此功能不会破坏像ob_end_flush()函数输出缓冲区。


此功能将发送输出缓冲区的内容(如有)。
如果你想进一步处理缓冲区的内容,你作为缓冲区的内容丢弃后ob_flush()之前
如果要调用 ob_get_contents,则在ob_flush() 之前 被调用
调用ob_flush() ob_get_contents()被调用。
调用ob_flush()后  缓冲区内容就被丢弃了就
此功能不会破坏像ob_end_flush()函数输出缓冲区。

ob_clean — 清空(擦掉)输出缓冲区
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush — 冲刷出(送出)输出缓冲区中的内容
ob_start — 打开输出控制缓冲



ob_flush()和flush()的区别

 

  “ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。正确使用的顺序是:先用ob_flush(),后用flush()。


<?php
  ob_start();  //这个东西好像是可要可不要 但是一旦要执行ob_get_contents和ob_end_clean就需要了
$cache_varible = array();
for($i=0;$i<5;$i++)
{
    echo 'printing...<br />';
    $cache_varible[] = ob_get_contents();  //一执行ob_flush缓冲区内容就没有了
    ob_flush();
    flush();
    sleep(1);
    //usleep(300000);
}

$cache_varible2 = array();
for ($i=5; $i>0; $i--)
{
    echo $i;
    $cache_varible2[] = ob_get_contents();
    
    ob_flush();//修改部分
    flush();
    sleep(1);
}



ob_end_clean();
var_dump("AAAAAAAA");
var_dump($cache_varible);  //在使用

var_dump($cache_varible2);


?>




PHP ob_start() 、ob_clean() 、ob_end_clean() 缓存
发表于 2011/04/15 由 大雄
ob_start([string|array user_function],[int chunk_size],[bool erase]) ;打开缓存区,将已载入的内容加载到缓存区
ob_get_contents();获取缓存区内容,经典用法 $str=ob_get_contents();
ob_end_clean();清除以前的缓存内容,以后的输入内容不被缓存. 一定要加上这个函数哦,

ob_start() 函数出现后开始所有的输出内容将被缓存,不被输出,直到出现 ob_end_clean() 函数。
ob_end_clean()以后输出内容不再被缓存 而且把以前的缓存内容清空掉。
所以为了使用刚刚缓存了的内容必须在ob_end_clean()函数出现之前使用 ob_get_contents() 函数提取已经缓存了的内容。

ob_clean()和ob_end_clean()有什么区别呢?
ob_clean 只是清除缓冲区中的内容.
ob_end_clean比ob_clean多做一些事情.就是关闭缓冲区.

ob_flush();刷新缓存区;
flush();这个和废物没什么区别,如果要用的话就跟在ob_flush后面.

意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,
后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。
所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。




<?php
//怎么理解  ob_start()  ob_get_contents() ob_end_clean()
//ob_start([string|array user_function],[int chunk_size],[bool erase]) ;
//打开缓存区,将已载入的内容加载到缓存区 把输出那同输出到缓冲区,而不是到浏览器。

//ob_start()在服务器打开一个缓冲区来保存所有的输出。
//所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束

//此时得用一个函数ob_get_contents()在ob_end_clean()前面来获得缓冲区的内容。

//函数ob_end_clean 会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。
var_dump("MMMMMMMMM");
ob_start();
echo "KKKKKKKKKK";
var_dump("BBBBBBBBBB");
$cache_varible = ob_get_contents();

ob_end_clean();
var_dump($cache_varible);
?>




<?php
 
if(file_exists("./index.htm"))//看静态index.htm文件是否存在
{
    $time=time();
    //文件修改时间和现在时间相差?的话,直接导向htm文件,否则重新生成htm
    
    if($time-filemtime("./index.htm")< 600)
    {
         
        header("location: ./index.htm");
    }
}
//在你的开始处加入ob_start();
ob_start();
//首页内容,就是你的动态部分了
//在结尾加入ob_end_clean(),并把本页输出到一个变量中
echo "AAAAAAAA";
$temp=ob_get_contents();
ob_end_clean();
//写入文件
$fp=fopen("./index.htm",w);
fwrite($fp,$temp) or die(写文件错误);

//echo"生成html完成!";
?>



//        http://developer.51cto.com/art/200912/166834.htm
您所在的位置:开发 > Web > PHP > 详解PHP ob_start()函数的功能要点
详解PHP ob_start()函数的功能要点
2009-12-04 09:50 佚名 seo-china.net 我要评论(2) 字号:T | T

PHP ob_start()函数是一个功能强大的函数,可以帮助我们处理许多问题,希望通过这篇文章的介绍,大家能够彻底掌握这一函数的用法。
AD:
PHP函数的运用范围非常广泛,我们可以在不断的实践中去体会这些函数给我们带来的好处。下面我们就来具体分析一下有关PHP ob_start()函数的功能特点。

PHP处理会话函数大总结
如何正确的实现Tomcat支持PHP
如何运用PHP rmdir()函数删除目录
同你分享PHP文件上传的一些注意事项
PHP垃圾代码的特征介绍
比如你用得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:

< ?php  
ob_start(); //打开缓冲区  
phpinfo(); //使用phpinfo函数  
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info  
$file=fopen(’info.txt’,'w’); //打开文件info.txt  
fwrite($file,$info); //写入信息到info.txt  
fclose($file); //关闭文件info.txt  
?>
用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些“过程”转化为“函数”的方法!

或许有人会问:“难道就这个样子吗?还有没有其他用途?”当然有了,比如笔者论坛的PHP 语法加亮显示就和这个有关(PHP默认的语法加亮显示函数会直接输出,不能保存结果,如果在每次调用都显示恐怕会很浪费CPU,笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了)。

可能现在大家对PHP ob_start()函数的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌握了使用ob_start()的要点。

<1>.使用PHP ob_start()函数打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出。

<2>.现在的你应该知道你所拥有的优势:可以在任何输出内容后面使用header,setcookie以及session,这是PHP ob_start()函数一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(”ob_gzhandler”);而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理……

<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。



flush()、ob_flush()、ob_end_flush()三者的区别:

首先,说下buffer,它是一个内存地址空间,为4096(1kb)【在php.ini配置文件中找到output_buffering配 置】,php有php output_buffering机制,php代码在执行的时候,并不是立即将内容输出,而是想将echo/print内容输出到buffer,buffer满的时候才会将数据交给系统内核交由tcp传给浏览器显示,当开启php php output_buffering机制(默认是开启的,可以通过ob_start()函数开启)后,只有当php buffer中的数据达到了设置值,才会将buffer中 的数据发送给浏览器。

但是浏览器也是有缓存的,一些版本的浏览当数据达到256字节的时候才输出内容,flush()可以将等待输出的内容立即发送到客户端,而ob_flush()只有等待到buffer满的时候才输出。

这里为大家举一个简单的例子,作为验证:

 

复制代码代码如下:

<?php
//防止浏览器的缓存
echo str_repeat(" ",1024);
for($i=0;$i<5;$i++){
 echo $i;
 sleep(1);
 flush();//会每隔1s输出一个数字,如果使用ob_flush()则会等待5s一起输出
}
?>
 来自 http://www.jb51.net/article/34057.htm


flush — 刷新输出缓冲
ob_clean — 清空(擦掉)输出缓冲区
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush — 冲刷出(送出)输出缓冲区中的内容
ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents — 返回输出缓冲区的内容
ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_length — 返回输出缓冲区内容的长度
ob_get_level — 返回输出缓冲机制的嵌套级别
ob_get_status — 得到所有输出缓冲区的状态
ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
ob_implicit_flush — 打开/关闭绝对刷送
ob_list_handlers — 列出所有使用中的输出处理程序。
ob_start — 打开输出控制缓冲
output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
 
 
PHP输出缓存控制详解 ob_start,flush,ob_flush
hanchaovince上传于2010-10-11|(41人评价)|3661人阅读|136次下载|文档简介|举报文档
 
PHP输出缓存控制详解 ob_start,flush,ob_flush  for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   flush();
   sleep(1);
 
}
   有了解过 PHP缓存输出控制函数的朋友肯定对上面这段代码很熟悉,它想实现的效果是每个1秒输出1个数字,完成全部输出需要10秒,不过实际执行中你会发现奇怪的现象,有些人或者有些时候它的表现如你所愿,而有些人或者有些时候却是10秒后才会一次性输出10个数字。我曾经为此抓狂不已,有朋友留言说这个情况往往是因为IE的缓存必须达到256个字符才会输出,可实际上我之前也考虑到IE的情况,可依旧会有时灵时不灵的情况。今天仔细读过手册才明白,这些不可预料的现象是有它的理由的。   原来php.ini中有两个关键参数会影响到php的缓存输出控制:   参数1:output_buffering :on/off 或者整数 。设置为on时,将在所有脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如output_buffering=4096,当缓存数据达到 4096字节时会自动输出刷新缓存。而这个参数的不同正是导致以上代码在不同时候执行结果不同的原因。当output_buffering关闭时,脚本所有的输出(echo)都会即时发送到客户端,执行上面代码时就是每秒输出一个数字。而开启output_buffering后,输出内容就会先缓存在服务端,直到脚本结束时才一起发送给客户端。   参数2:implicit_flush:on/off。设定ON意味着,当脚本有输出时,自动立即发送到客户端。相当于在echo后自动加flush()。   php缓存输出控制的相关函数:   ob_start()   第一个参数:回调函数,可选。在缓存输出前可以对其进行过滤或其他处理。最常见的用法是ob_start('ob_gzhandler'),即对缓存的数据进行gzip压缩后再发送给客户端。 第二个参数:缓存块的大小,可选。如果被缓存的内容达到或操作缓存块的大小,缓存会自动输出。默认值是0,指不限定大小,缓存到结束为止。还有个特殊值1,代表chunk_size=4096。 
 
第三个参数:是否擦除缓存,可选,默认是true,如果设置为false,则在脚本执行结束前,缓存都不会被清除。   可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。  而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。 服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还可以开启另外一个缓存 ob_start()。不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。   ob_start()可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一个 ob_start(),我们假定,外层的ob_start(),编号是A,内层的ob_start() 编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。   另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。   flush()和ob_flush()   这两个函数的使用怕是很多人最迷惑的一个问题,手册上对两个函数的解释也语焉不详,没有明确的指出它们的区别,似乎二者的功能都是刷新输出缓存。但在我们文章一开始的代码中如果讲fush()替换成 ob_flush(),程序就再不能正确执行了。显然,它们是有区别的,否则也手册中直接说明其中一个是另外一个函数的别名即可了,没必要分别说明。那么它们的区别到底是什么呢?   反复研究了手册的说明,参考了手册中一些人的留言,自己琢磨应该是这样的:  在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态,flush()可以将等待输出的内容立即发送到客户端。  开启缓存后,脚本输出的内容存入了输出缓存中,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。  
 
也就是说本文开头的脚本,可以根据缓存开启与否,有如下几种不同的写法:   注:以下代码都未考虑IE缓存必须大于256字节才输出的问题,如在IE下测试,请在代码开始加一句:
“echo str_repeat(' ',256)”  写法1:  output_buffering = off implicit_flush=off   for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   flush();
   sleep(1);
 
}
   写法2:  output_buffering = on implicit_flush=off   for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   ob_flush();
   flush();
   sleep(1);
 
}
   写法3:  output_buffering = off implicit_flush=off   ob_start();
 for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   ob_flush();
 
 
   flush();
   sleep(1);
 
}
   写法4:  output_buffering = on implicit_flush=off   ob_end_flush();
for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   flush();
   sleep(1);
 
}
   写法5:  output_buffering = on implicit_flush=off   ob_end_clean();
for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   flush();
   sleep(1);
 
}
   写法6:  output_buffering = on;
implicit_flush=on   ob_end_clean();
// 或者ob_end_flush();
for($i=0;$i<10;$i++) 
{
 
   echo $i.'<br />';
   sleep(1);
 
}
   写法7:  output_buffering = on;
implicit_flush=on   ob_end_clean();
// 或者ob_end_flush();
for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   flush();
   sleep(1);
 
}
   写法8:  output_buffering = off implicit_flush=on   for($i=0;$i<10;$i++) 
{
   echo $i.'<br />';
   sleep(1);
 
}
  
 
 
普通分类: