http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html

PHP中刷新输出缓冲
buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。

同样的道理,在PHP中,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browser

在PHP中与刷新缓冲相关的函数有三个:

1). flush
刷新PHP程序的缓冲,而不论PHP执行在何种情况下。该函数将当前为止程序的所有输出发送到用户的浏览器。 但是该函数不会对服务器或客户端浏览器的缓存模式产生任何影响,也不会对PHP本身的缓存产生任何影响。

2).ob_flush

该函数对PHP本身的的缓存进行输出。PHP本身的缓存受php.ini中的output_buffering的控制。ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

与PHP本身输出缓冲相关的两个PHP配置是:
      参数1:output_buffering :on/off 或 者整数 。设置为on时,将在所有脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如output_buffering=4096,当缓存数 据达到4096字节时会自动输出刷新缓存。而这个参数的不同正是导致以上代码在不同时候执行结果不同的原因。当output_buffering关闭时, 脚本所有的输出(echo)都会即时发送到客户端,执行上面代码时就是每秒输出一个数字。而开启output_buffering后,输出内容就会先缓存 在服务端,直到脚本结束时才一起发送给客户端。
     参数2:implicit_flush:on/off。设定ON意味着,当脚本有输出时,自动立即发送到客户端。相当于在echo后自动加flush()。

3).ob_implicit_flush

这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。

以下是举例:

view plain
  1. <?php
  2. ob_end_clean();
  3. echo str_pad(" ", 256);
  4. for ($i=100; $i>0; $i--) {
  5. echo $i, '<br/>';
  6. flush();
  7. sleep(1);
  8. }
  9. ?>

以上代码应该隔一秒钟输出一次$i.  以上echo str_pad(" ", 256)的目的是IE需要接受到256个字节之后才开始显示。 以上代码还有以下两种写法。

view plain
  1. <?php
  2. echo str_pad(" ", 256);
  3. for ($i=100; $i>0; $i--) {
  4. echo $i, '<br />';
  5. ob_flush();
  6. flush();
  7. sleep(1);
  8. }
  9. ?>
view plain
  1. <?php
  2. ob_implicit_flush(true);
  3. echo str_pad(" ", 256);
  4. for ($i=100; $i>0; $i--) {
  5. echo $i, '<br />';
  6. ob_flush();
  7. sleep(1);
  8. }
  9. ?>

另外我们还需要注意刷新缓冲不光受以上几方面的影响,还受以下影响:

1). 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函 数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

2). PHP安装模式的影响。以上方式对于PHP以Apache模块方式安装的情况,可以直接使用。  如果以FastCgi方式还需要注意以下几下配置:

a). Apache+Fcgid+PHP
        FcgidOutputBufferSize 0(默认是65536)

在配置Fcgid时, 设置这项值为0, 以上代码做刷新缓冲时,才能达到自己想要的效果。

b).IIS+FastCgi+PHP

ResponseBufferLimit=0

修改WINDOWS\system32\inetsrv\fcgiext.ini下的这一项。

c).nginx+php-fpm

fastcgi_buffer_size 4k;

        fastcgi_buffers 8 4k;
        fastcgi_busy_buffers_size 4k
        gzip off;

PHP函数说明:

1.string str_pad ( string $input , int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT ]] )

该函数返回 input 被从左端、右端或者同时两端被填充到制定长度后的结果。如果可选的 pad_string 参数没有被指定,input 将被空格字符填充,否则它将被 pad_string 填充到指定长度

2.相关flush类似函数如下

  • 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_ implicit_ flush
  • ob_ list_ handlers
  • ob_ start
  • output_ add_ rewrite_ var
  • output_ reset_ rewrite_ va

PHP中刷新输出缓冲相关推荐

  1. 剖析PHP中的输出缓冲

    剖析PHP中的输出缓冲 本文按署名·非商业用途·保持一致授权 作者:  ,发表于2005年12月24日01时54分 我们先来看一段代码. <?php for ($i=10; $i>0; $ ...

  2. php不缓存直接输出,如何在PHP中禁用输出缓冲

    做两件事: 禁用用户空间输出缓冲区,或者... 在全球范围内,通过... output_buffering在您的php.ini中关闭,或 output_buffering使用以下命令在Apache配置 ...

  3. php ob 缓存,php中ob函数缓冲机制深入理解

    下面就php中ob函数缓冲机制通过文字说明加代码分析的形式给大家展示如下: 对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会'嗖 ...

  4. php.ini 关闭输出缓冲,php 输出缓冲 Output Control用法实例详解

    本文实例讲述了php 输出缓冲 Output Control用法.分享给大家供大家参考,具体如下: 关于php的输出缓冲,首先要说明的是什么是缓冲(buffer),比如我们通过记事本在编辑文件的时候, ...

  5. PHP输出缓冲(Output Buffering)

    什么是缓冲区? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题~其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备 ...

  6. VC绘图中的双缓冲技术

    VC绘图中的双缓冲技术 转自:VC 绘图,使用双缓冲技术实现 ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* **** ...

  7. C语言如何加缓冲,C语言学习笔记之输出缓冲

    在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...

  8. java如何刷新输出_如何刷新打印功能的输出?

    如何刷新Python打印输出? 我建议五种方法: 在Python 3中,调用 print(..., flush=True) (在Python 2的print函数中不提供flush参数,并且print语 ...

  9. oracle设置缓存大小设置多少,【数据库类※从V$DB_CACHE_ADVICE中设置数据缓冲大小※】...

    [数据库类※从V$DB_CACHE_ADVICE中设置数据缓冲大小※]     Oracle 9i引入了一个新的途径来预测数据缓冲cache中附加数据缓存的所带来的好处的多少.V$DB_CACHE_A ...

最新文章

  1. C++ 的五个普遍误解
  2. SAP数据分析图形相关内容
  3. [ROBOT] python library 如何能获取到ROBOT框架里面的全局变量,例如${OUTPUT DIR}等
  4. 设计模式练习_设计练习是邪恶的
  5. kafka分区和es的分区支持对比
  6. 架设好传奇登录器显示无法连接服务器,完美登录器使用常见问题解决办法
  7. 内网远程桌面控制软件Radmin
  8. C语言:一元二次方程求解
  9. 导致MySQL的查询语句效率低下的可能原因
  10. bboss ioc快速入门教程
  11. 医疗器械软件网络安全相关
  12. 喵呜效应再现!跨界新品齐聚天猫618,网友:一秒无
  13. 川土微电子8通道隔离式数字输入接收器
  14. 3-10 Pandas的数据规整
  15. 今夏成为小葫芦娃的最后机会!
  16. Linux环境下编译并执行ava helloworld程序
  17. C语言栈顺序存储的数据结构
  18. 关于s19赛季服务器维修,S19赛季已开服,版本重点调整需知熟,想要跟上游戏节奏必了解...
  19. 当心,前面有地雷——C语言实现简单扫雷小游戏
  20. 【大数据Hadoop】HDFS-HA模式下Checkpointer机制代码分析

热门文章

  1. 集合对象的数据绑定(1)
  2. 解决博客园模版错误排版的一个问题
  3. WCF .net Tcp 错误异常
  4. dubbo接口测试_Django测试工具平台之Dubbo接口请求 + 前端
  5. Python破解验证码技术,识别率高达百分之八十
  6. Python爬虫之reuqests实现简单网页采集--网页采集教程
  7. C++和python先学哪个
  8. java 注解开发_Java中的注解到底是如何工作的?
  9. 怎么使用html及jsp开发,jsp怎么用css
  10. c语言程序设置分数,用C语言编程平均分数