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

这里的技术是共享的

You are here

cache_introduce ob_start() 有大用 有大大用

shiping1 的头像

在脚本中使用 ini_set("output_buffering”,”0″)来设置 隔秒输出 间隔输出 每秒输出 才起作用 可以看最下面
从 "
我们先来看一段代码"处开如看
<?php
ob_end_clean();
//修改部分
for ($i=10;$i>0;$i--)
 {
    echo $i;flush();sleep(1);
 }
  ?>
嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。


<?php
ob_end_clean();
 ob_implicit_flush(true);
for ($i=10;$i>0;$i--)
{
   echo $i;sleep(1);
}
//请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,
//即刻把输出发送到浏览器。
//这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。
 ?>
 



运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。

打开php.ini,搜索output_buffering,
我们会看到类似这样的设置 output_buffering = 4096。
正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,
缓冲大小为4096bytes.

在我们的第一段代码里,之所以没有按预期的输出,
正是因为这个output_buffering把那些输出都缓冲了。
没达到4096bytes或者脚本结束,输出是不会被发送出去的。

而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。

第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。

如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的 output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用 ini_set("output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。

可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??

<?php for ($i=10;$i>0;$i--) {
   echo $i;ob_flush();sleep(1);} ?>
请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。
所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。




<?php
for ($i=10;$i>0;$i--)
 {
    echo $i;
 ob_flush();
 //修改部分
 flush();
 sleep(1);}
 ?>


运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。

打开php.ini,搜索output_buffering,
我们会看到类似这样的设置 output_buffering = 4096。
正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,
缓冲大小为4096bytes.

在我们的第一段代码里,之所以没有按预期的输出,
正是因为这个output_buffering把那些输出都缓冲了。
没达到4096bytes或者脚本结束,输出是不会被发送出去的。

而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。

第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。

如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的 output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用 ini_set("output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。

可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??

<?php for ($i=10;$i>0;$i--) { echo $i;ob_flush();sleep(1);} ?>
请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。
所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。




<?php
for ($i=10;$i>0;$i--)
 {
    echo $i;
 ob_flush();
 //修改部分
 flush();
 sleep(1);}
 ?>


运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。

打开php.ini,搜索output_buffering,
我们会看到类似这样的设置 output_buffering = 4096。
正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,
缓冲大小为4096bytes.

在我们的第一段代码里,之所以没有按预期的输出,
正是因为这个output_buffering把那些输出都缓冲了。
没达到4096bytes或者脚本结束,输出是不会被发送出去的。

而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。

第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。

如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的 output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用 ini_set("output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。

可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??

<?php for ($i=10;$i>0;$i--) { echo $i;ob_flush();sleep(1);} ?>
请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。
所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。



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_implicit_flush(true);
for ($i=10;$i>0;$i--)
{
echo $i;
ob_flush();
 sleep(1);
}  
//请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,
//即刻把输出发送到浏览器。
//这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。
?>




//      http://developer.51cto.com/art/200912/166834.htm


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

 更新时间:2018年01月18日 15:55:12   作者:恁金峰兄    我要评论

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

一、背景

有一段代码,因为调用了封装的方法,所以会有一些本来不需要的返回值。这些返回值该怎么处理才能让它消失呢。有的人会说,清除变量不就好了吗?但假如这个返回值无法清除,那又该怎么办呢?

二、ob_start()

1、概念:

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。

内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。 想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外, 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

来自php手册:http://php.net/manual/zh/function.ob-start.php

2、缓冲区的基本用法

1
2
3
4
5
6
//打开缓冲区
ob_start();
//清除缓冲区中的内容
ob_clean();
//冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_end_flush();

三、基本的测试

1、

1
2
3
4
echo '1';
ob_start();
echo '2';
ob_clean();

结果: 1

解释:这是最简单的用法,那就是给不想输出内容的外面加上ob_start();,然后再清除缓冲区中的内容,这样就实现了咱们的使用场景。我们可以选择性的输出自己想输出的。去掉自己不想输出的。

2、

1
2
3
4
5
echo '1';
ob_start();
echo '2';
//输出缓冲区
ob_end_flush();

结果: 12

3、

1
2
3
4
5
6
7
8
//打开缓冲区
ob_start();
echo '1';
//清除缓冲区,此时不会输出1
ob_clean();
//输出缓冲区。但是因为上面已经清除过缓冲区了,所以不会输出 1
ob_end_flush();
echo '2';

结果: 2

4、

1
2
3
4
5
6
ob_start(); //打开缓冲区
echo '1';
$a = ob_get_contents(); //输出缓冲区内容到$a,相当于赋值给$a
ob_clean();   //这里清除缓冲区内容
echo '2';    //输出2
echo $a;    //输出$a

结果: 2 1

解释:这里的ob_get_contents();是获取缓冲区的内容。我们可以把获取的内容赋值给一个变量,这样,就算清除了缓冲区,我们输出变量,还是可以正常的输出1的。

四、常用的地方

该函数常用与页面静态化,构造微型web框架能起到很关键的作用,讲渲染好的页面通过输入缓存的方式直接写入到一个文件,这样判断该文件是否存在即可实现用户本次访问需不需要去重新渲染一个页面,也可应用到大型项目中,用nosql去存储渲染好的页面,具体使用方法应人而异,看您喜欢哪种

上面就是我自己亲自做的简单测试。大家有需要的话,可以对照着php手册,多做一些测试。

原文链接:

http://blog.csdn.net/ljfphp/article/details/78839654


来自 https://www.jb51.net/article/133183.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(),那么就要你自己控制输出方式了。
 





//   http://developer.51cto.com/art/200912/166834.htm



详解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(),那么就要你自己控制输出方式了。





//   http://developer.51cto.com/art/200912/166834.htm



详解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(),那么就要你自己控制输出方式了。
 
 


http://www.nowamagic.net/php/php_ObStart.php

PHP ob_start() 函数介绍
2010-03-29
php ob_start 与 ob_end_flush() 是 php 的缓冲输出函数。
ob_start([string output_callback])- 打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息。
ob_end_flush - 结束(发送)输出缓冲区的内容,关闭输出缓冲区。
php 输出东西,会保存在一个 php 维护的内存里,称为 buffer 也行,缓存也行,都是一个意思。然后当这个 buffer 满了,php 会自动往 web server 发送这些数据。
也就是说每次 echo,并不一定会输出东西,而是保存在 buffer 里。
ob_start() 的意思,可以理解为(但是实际上和我下面的说法有区别),这个 buffer 由 ob_ 系列函数来来控制,也就是,PHP 不会维护自己的 buffer,不会自动把buffer 的内容自动发送到 web server,直到你 ob_end() 或者类似的 ob 操作。
ob_函数一般用来捕获当前的输出,跟效率是没什么关系的。至于为什么捕获输出,原因很多,例如我捕捉输出,缓存到一个文件里,下次请求就可以直接读这个 cache 文件的内容作为输出了。
1
ob_start();
2
内容
3
echo ob_get_contents() ;
就是类似上面这样的代码了,说白了没有任何意义的代码。
我仔细想过之后,然后上网搜索了一下,发现相当多的初学者(技术上的初学者,不一定是PHP第一年生,有的人一辈子是初学者),并不理解ob的作用,只是网上经常把ob叫做输出缓冲,输出缓存,所以相当多的人就把ob系列函数当作是加快PHP页面显示的工具。
其实ob是output buffering的简称,而不是output cache,ob用对了是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担。下面我说说ob的基本作用。
防止在浏览器有输出之后再使用setcookie,或者header,session_start函数造成的错误。(我本以为最开始说的代码是这样的作用,但后来朋友说不是的),其实这样的用法少用为好,养成良好的代码习惯。
捕捉对一些不可获取的函数的输出,比如phpinfo会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
生成静态文件,其实就是捕捉整页的输出,然后存成文件,经常在生成HTML,或者整页缓存中使用。
对于刚才说的第三点中的GZIP压缩,可能是很多人想用,却没有真真用上的,其实稍稍修改下我朋友的代码,就可以实现页面的gzip压缩。
1
ob_start(ob_gzhandler);
2
内容
没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断浏览器是否支持gzip(现在好像都支持,iphone浏览器好像都支持了)。
以前的做法是判断一下浏览器是否支持gzip,然后用第三方的gzip函数来压缩ob_get_contents() 的内容,最后echo。


//      http://www.phpgz.com/html/yying/gjtai/20090924/976.html



Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想  
在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(),  
发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。  

我们先举一个简单的例子,让大家对Output Control有一个大致的印象:  
Example 1.  
-------------------------------------------------------------------------------------  
---------------------------------  
ob_start();//打开缓冲区  
echo "Hello\n";//输出  
header("location:index.php”);//把浏览器重定向到index.php  
ob_end_flush();//输出全部内容到浏览器  
?>  
-------------------------------------------------------------------------------------  
---------------------------------  
所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用  
这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我  
们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had  
all ready send by”!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面  
的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所  
以并不会有任何文件头输出的错误!  


一、 相关函数简介:  
1、Flush:刷新缓冲区的内容,输出。  
函数格式:flush()  
说明:这个函数经常使用,效率很高。  
2、ob_start :打开输出缓冲区  
函数格式:void ob_start(void)  
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。  
为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。  
3 、ob_get_contents :返回内部缓冲区的内容。  
使用方法:string ob_get_contents(void)  
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。  
4、ob_get_length:返回内部缓冲区的长度。  
使用方法:int ob_get_length(void)  
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激  
活。则返回 FALSE。  
5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。  
使用方法:void ob_end_flush(void)  
说明:这个函数发送输出缓冲区的内容(如果有的话)。  
6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区  
使用方法:void ob_end_clean(void)  
说明:这个函数不会输出内部缓冲区的内容而是把它删除!  
7、ob_implicit_flush:打开或关闭绝对刷新  
使用方法:void ob_implicit_flush ([int flag])  
说明:使用过Perl的人都知道$│=x的意义,这个字符串可以打开/关闭缓冲区,而  
ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直  
接发送到浏览器,不再需要调用 flush()  


二、深入了解:  

1. 关于Flush函数:  
这个函数在PHP3中就出现了,是一个效率很高的函数,他有一个非常有用的功能就是刷新browser  
的cache.我们举一个运行效果非常明显的例子来说明flush.  
Example 2.  
-------------------------------------------------------------------------------------  
---------------------------------  
for($i = 1;$i <= 300;$i++ ) print(" ");  
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出  
// 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经  
// 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会  
// 源源不断的被发送出去。  
For($j = 1;$j <= 20;$j++) {  
echo $j.”  
”;  
flush();//这一部会使cache新增的内容被挤出去,显示到浏览器上  
sleep(1);//让程序"睡”一秒钟,会让你把效果看得更清楚  
}  
?>  
-------------------------------------------------------------------------------------  
---------------------------------  
注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush  
(),这样做的好处是:提高效率!  

2. 关于ob系列函数:  
我想先引用我的好朋友y10k的一个例子:  
Example 3.  
-------------------------------------------------------------------------------------  
---------------------------------  

比如你用得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要  
保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了  
缓冲区的控制,我们可以轻松的解决:  
-------------------------------------------------------------  
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信息保存下来,这在以前恐怕没有办法办到!其实上  
面就是将一些"过程”转化为"函数”的方法!  

-------------------------------------------------------------------------------------  
---------------------------------  
可能现在大家对ob_start()的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌  
握了使用ob_start()的要点。  
<1>.使用ob_start打开browser的cache,这样可以保证cache的内容在你调用flush  
(),ob_end_flush()(或程序执行完毕)之前不会被输出。  
<2>.现在的你应该知道你所拥有的优势:可以在任何输出内容后面使用header,setcookie以及  
session,这是ob_start一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后  
自动运行命令,比如ob_start("ob_gzhandler");而我们最常用的做法是用ob_get_contents()得  
到cache中的内容,然后再进行处理……  
<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完  
毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。  

来,让我们看看能用ob系列函数做些什么……  

一、 静态模版技术  

简介:所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页  
面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用  
PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带  
来的好处是非常巨大的。  

我所知道的实现静态输出的有两种办法:  
<1>.通过y10k修改的phplib的一个叫template.inc.php类实现。  
<2>.使用ob系列函数实现。  
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。  
我们现在来看一看第二种方法的具体实现:  
Example 4.  
-------------------------------------------------------------------------------------  
---------------------------------  
ob_start();//打开缓冲区  
?>  
php页面的全部输出  
$content = ob_get_contents();//取得php页面输出的全部内容  
$fp = fopen("output00001.html”,"w”);//创建一个文件,并打开,准备写入  
fwrite($fp,$content);//把php页面的内容全部写入output00001.html,然后……  
fclose($fp);  
?>  
-------------------------------------------------------------------------------------  
---------------------------------  
这样,所谓的静态模版就很容易的被实现了……





mod_rewrite最简单的知识(转)
2007-12-27 20:22
开启Apache 的mod_rewrite功能:
在Apahce的配置文件httpd.conf中把#LoadModule rewrite_module modules/mod_rewrite.so
前的#去掉,改为LoadModule rewrite_module modules/mod_rewrite.so
在httpd.conf中找到下面这段

<Directory />
   Options FollowSymLinks
   AllowOverride None
</Directory>

将AllowOverride None 改成 AllowOverride ALL

这样Apache的mod_rewrite就开启了。

简单使用mod_write。
该功能的使用:一种是将转向规则写在httpd.conf中,这样效率比较高,但缺乏灵活性;
另一种是写在.htaccess文件中,将该文件放到需要运用该重写规则的网站目录的根目录。
比如网站结构
+DocumentRoot
|---News
|---BBS
|---Blog
以上结构中我只希望在新闻模块运用mod_write则只需将.htaccess
文件放到 /News目录下,则该目录下的所有请求都会去和.htaacess中的地址重写规则匹配。.htaccess虽然灵活但确带来性能上的缺失。

重写规则样例(其中的正则表达式就不在此叙述了):
RewriteEngine On
RewriteRule ^index(.*)$ /test.php [L]
RewriteRule ^index_([0-9]+).html$ getnews.php?id=$1 [L]

第一句RewriteEngine On一定不能少,否则该文件将不起任何作用。
第二句RewriteRule表示规则开始,具体为^index(.*)$ 将对 index,cgi (cgi表示html,php,。。等)的请求让test.php来处理,但地址栏上仍然写的是 index.cgi。[L]表示该规则结束
第二句 ^index_([0-9]+).html 表示 index_(0~9的任何数字任何组合).html,就等于可以是 index_1.html
index_94.html ,index_4565.html ...任何的形式
以 index_94.html 为例:
对index_94.html 的请求 将会交给 getnews.php?id=94来请求,可见 $1就代表参数([0-9]+)。

这个例子演变后可以完成大部分的请求:

RewriteRule ^news/([0-9]+)/(delete).html$ news/news_instance.php?news_id=$1&act=$2 [L]




最后附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里,每次输出,都会把前一次的输出覆盖掉。
以下代码只在firefox下可用,其他浏览器并不支持multipart/x-mixed-replace的Content-Type.

<?php
header('Content-type: multipart/x-mixed-replace;boundary=endofsection');
 print "\n--endofsection\n";
 $pmt = array("-","\\","|","/" );
 for( $i = 0;$i <10;$i ++ )
 {
    sleep(1);
    print "Content-type: text/plain\n\n";
    print "Part $i\t".$pmt[$i % 4];
    print "--endofsection\n";
    ob_flush();flush();
 }
 print "Content-type: text/plain\n\n";
print "The end\n";print "--endofsection--\n";?>



http://www.yuntai.org/show.aspx?&id=508&cid=57


http://www.cnblogs.com/angelmtprocess/archive/2008/05/22/1204691.html



http://hi.baidu.com/heiday/blog/item/c11fcc616ebe61d68db10d2b.html


http://blog.csdn.net/zxkln/archive/2011/02/09/6175214.aspx


http://www.perfgeeks.com/?p=344


http://www.phpgz.com/html/yying/gjtai/20090924/976.html


http://www.nowamagic.net/php/php_ObStart.php


我们先来看一段代码: 

    {C}{C}{C}{C}{C}
    for ($i=10; $i>0; $i--) 
    { 
     echo $i; 
     flush(); 
     sleep(1); 
    } 
    ?> 

    按照php手册里的说法,该函数将当前为止程序的所有输出发送到用户的浏览器。 

    上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来。 

    好,我们来改一下这段代码,改成 

    {C}{C}{C}{C}{C}
    ob_end_clean();//修改部分 
    for ($i=10; $i>0; $i--) 
    { 
     echo $i; 
     flush(); 
     sleep(1); 
    } 
    ?> 
    嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。 

    我再来改一改。 

    {C}{C}{C}{C}{C}
    for ($i=10; $i>0; $i--) 
    { 
     echo $i; 
     ob_flush();//修改部分 
     flush(); 
     sleep(1); 
    } 
    ?> 
    运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢? 
    别急,我们来看看php.ini。 

    打开php.ini,搜索output_buffering,我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,缓冲大小为4096bytes. 

    在我们的第一段代码里,之所以没有按预期的输出,正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束,输出是不会被发送出去的。 

    而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。 

    第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。 

    如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用ini_set(”output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。 

    可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗?? 

    {C}{C}{C}{C}{C}
    for ($i=10; $i>0; $i--) 
    { 
     echo $i; 
     ob_flush(); 
     sleep(1); 
    } 
    ?> 
    请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。 

    那是不是flush()在这里就是不可缺少的呢?不是的,我们还有另外一种方法,使得当有数据输出的时候,马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。(当你把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都不需要了) 

    {C}{C}{C}{C}{C}
    ob_implicit_flush(true); 
    for ($i=10; $i>0; $i--) 
    { 
     echo $i; 
     ob_flush(); 
     sleep(1); 
    } 
    ?> 
    {C}{C}{C}{C}{C}
    ob_end_clean(); 
    ob_implicit_flush(true); 
    for ($i=10; $i>0; $i--) 
    { 
     echo $i; 
     sleep(1); 
    } 
    ?> 
    请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。 

    以上所诉可能在某些浏览器中不成立。因为浏览器也有自己的规则。我是用Firefox1.5,IE6,opera8.5来测试的。其中opera就不能正常输出,因为它有一个规则,就是不遇到一个HTML标签,就绝对不输出,除非到脚本结束。而FireFox和IE还算比较正常的。 

    最后附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里,每次输出,都会把前一次的输出覆盖掉。 
    以下代码只在firefox下可用,其他浏览器并不支持multipart/x-mixed-replace的Content-Type. 

    {C}{C}{C}{C}{C}
      header('Content-type: multipart/x-mixed-replace;boundary=endofsection'); 
      print "\n--endofsection\n"; 

      $pmt = array("-", "\\", "|", "/" ); 
      for( $i = 0; $i <10; $i ++ ){ 
         sleep(1); 
         print "Content-type: text/plain\n\n"; 
         print "Part $i\t".$pmt[$i % 4]; 
         print "--endofsection\n"; 
         ob_flush(); 
         flush(); 
      } 
      print "Content-type: text/plain\n\n"; 
      print "The end\n"; 
      print "--endofsection--\n"; 
    ?> 

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 剖析 中的输出缓冲 php输出缓冲区、php 输出缓冲、输出缓冲区数据块设置、输出缓冲器、输出缓冲区,以便于您获取更多的相关知识。

来自 https://yq.aliyun.com/ziliao/108274


 

PHP每隔一段时间输出一些数据的实现方法  

2015-07-27 16:19:37|  分类: PHP |  标签:后台  php  |举报|字号 订阅

  
<?php
    echo str_repeat(" ", 4096);
    header("Content-Type:text/html;charset=UTF-8");
    date_default_timezone_set("Asia/Shanghai");
    for($i=0;$i<3;$i++){
        echo "当前时间:".date("Y-m-d H:i:s")."<br>";
        ob_flush();
        flush();

        sleep(1);
    }

/*请注意红色的这三行,然后说明一下为什么这样用。按正常逻辑来看,我并不需要加红色的这三行才能实现想要的功能,但是不加你会发现程序达不到想要的效果,它会等三个时间一起输出。
这是为什么呢?
首先PHP有一个缓冲机制:

php代码在执行的时候,并不是立即将内容输出,而是想将echo/print内容输出到buffer,buffer满的时候才会将数据交给系统内核交由tcp传给浏览器显示
所以我们这里先用ob_flush()--
----------把数据从PHP的缓冲中释放出来
再加上flush()----------把不在缓冲中的或者说是被释放出来的数据发送到浏览器
然后我们发现在chorme中程序可以正常使用了,但是在IE中还是一样,这又是为什么?
原来某些浏览器自己也是有缓存机制的:
一些Web服务器或浏览器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有加上

echo str_repeat(" ", 4096);
*/

?>

来自 http://blog.163.com/peijie_love_shasha/blog/static/245356013201562741013827/
普通分类: