PHP输出缓冲

2017-03-02 22:41:04

  首先要了解的是,PHP、web服务器(apache服务器)以及浏览器都有自己的缓冲区(buffer),这三者输出数据前都会先把要输出的数据保存到自身的缓冲区,待自身的缓冲区被数据填满或者存储了一定量的数据之后,就会把数据输出来【注:各个浏览器的缓冲区要求存储的数据量不同,IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上】。

PHP程序输出内容(echo、print_r …)到浏览器总共有以下步骤:

echo、print => php output_buffering => webServer buffer => browser buff => browser display

即:脚本输出 => php的缓冲区设置 => 系统的缓冲区设置(apache、nginx) => 浏览器的缓冲区设置 => 显示给用户

具体步骤如下如下图所示

PHP缓冲区(PHP Buffer)

  php运行的结果先放入缓冲区(buffer),只有当缓冲区满了或者php运行完毕,才将数据输出去。

  缓冲区开关是通过php.ini中的output_buffering变量控制。在php.ini中,我们可以设置output_buffering为大于0的数值来打开buffer。此外我们可以设置“output_buffering=off”来关闭php缓冲区,然后通过ob_start()函数来开启php缓冲区。【注:ini_set()函数无法修改php buffer的设置】

  大家都说:ob_start()是将php buffer打开,ob_end_flush()是将php buffer关闭。需要注意的是如果php.ini中php buffer是关闭的,再次调用ob_end_flush()会报warning。

web服务器缓冲区(Webserver buffer)

  这里只讲apache服务器的缓冲区。

  当php的输出数据给apache服务器时,它也会做一层buffer(也将数据放入它的缓冲区,当缓冲区数据满或执行完毕时,才输出数据)。若想关闭缓冲区,可以在php层使用flush()来强制将缓冲区数据从apache缓冲区输出。

  flush() 的工作原理:在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区。 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果,例如mod_gzip:可能自己进行输出缓冲区,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

浏览器缓冲区(Browser buffer)

  浏览器从服务器接收的数据不会直接显示,而会先将数据保存在浏览器缓冲区,等到保存的数据达到一定的长度时(不同浏览器长度不同,IE为256Bytes, Chrome与FireFox为1000Bytes),浏览器的缓冲区就相当于填满,只有数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上。

  在php中无法控制浏览器的缓冲区的开关,如果希望输出数据不受浏览器缓冲区的影响,可以先发送一些空格来填满浏览器的buffer,浏览器的buffer一满,就会将其他新输出的数据不经过缓冲区直接输出。

  但是不同的浏览器会设置不同的buffer大小。为了保险期间,可以发送4096个空格,因为目前比较流行的浏览器的buffer还没有超过4k(一个内页大小)。

  在php.ini中关闭php缓冲区的前提下,我们可以在apache服务器下执行以下代码来探究以上讨论的三者缓冲区

 1 <?php
 2          ob_start();                            #开启php缓冲区
 3          echo str_repeat(‘&nbsp;‘, 4096);       #填满浏览器的缓冲区,以便浏览器可以直接输出之后的内容
 4          echo ‘<br>‘;
 5
 6          for ($i=0; $i < 5; $i++) {
 7                    echo $i,‘<br>‘;
 8                    //ob_flush();      #刷新php缓冲区,是数据不在php缓冲区停留,直接输出
 9                    flush();           #刷新(冲刷)web服务器的缓冲区,这里可以特指apache的缓冲区
10                    sleep(1);          #暂停1秒
11          }
12 ?>

参考来源:http://blog.csdn.net/fwkjdaghappy1/article/details/25402809

时间: 2024-10-02 19:54:18

PHP输出缓冲的相关文章

php flush()刷新不能输出缓冲的原因分析

在php程序编写中,flush()的使用率还是挺高的,它在网页表现即时信息效果时发挥了极为重要的作用,比如之前写的php实现限制文件下载速度的代码实例,flush()就起了举足轻重的作用,是进度条实现代码里的关键语句. 关于flash()的解释 语法: flush(); 作用: 刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等).该函数将当前为止程序的所有输出发送到用户的浏览器. 问题: flush()刷新为什么不能输出缓冲? 很简单的程序代码 for ($i=10

PHP输出缓冲控制 - Output Control 函 应用详解

简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示. 其实对于PHP程序员来说,基本上每个脚本都涉及到了输出缓冲,只是在大多数情况下,我们都不需

PHP中输出缓冲

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

PHP输出缓冲(Output Buffering)

什么是缓冲区? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题~其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备(磁盘等)的运作. PHP在执行的时候,在什么地方有用到缓冲区? 想要了解PHP的缓冲区,就要知道执行PHP的时候,缓冲区被设置到了什么地方. 当执行PHP的时候,如果碰到了echo print_r之类的会输出数据的代码,PHP就会将要输出的数据放到PHP自身的缓冲区,等待输出. 当PHP自身的缓冲

诡异的php 输出缓冲

我的本地环境 windows + apche + php5.2 今天,碰到一个诡异的问题,以前认为  php 脚本中调用 heade()函数之前不能有任何的如 echo,print ,print_r,var_dump等输出,否则的话就会报错. 但是, <?php header( 'Expires: Mon, 26 Jul 1998 05:00:00 GMT' ); echo "Expires: Mon, 26 Jul 1998 05:00:00 ;"; header( 'Expi

PHP中刷新输出缓冲

http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域.通过buffer,可以使进程这间的相互等待变少.这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到bu

PHP输出缓冲控制- Output Control 函数应用详解

说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统 是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示. 其实对于PHP程序员来说,基本上每个脚本都涉及到了输出缓冲,只是在大多数情况下,我们都不需要对

PHP中刷新输出缓冲详解[转载]

PHP中刷新输出缓冲详解 分类: PHP Web开发2011-07-23 17:42 1795人阅读 评论(0) 收藏 举报 phpbuffer浏览器outputapache模块脚本 buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域.通过buffer,可以使进程这间的相互等待变少.这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这

perl的输出缓冲

  今天写一个小脚本的时候,需要即时输出当前进度到命令行上,并即时将重要数据写入报告文件中.但是perl默认是有输出缓冲的,显示到命令行上必须以\n结尾才行,输出到文件中,回车了都不行,非得要等缓冲区满了. 代码: select( STDOUT ); $| = 1; open( REPORT, ">report.txt" ) || die "create report error: $!\n"; select( REPORT ); $| = 1; select

response对象设置输出缓冲大小

response对象设置输出缓冲大小 制作人:全心全意 通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区,在计算机术语中,缓冲区被定义为暂时放置输入或输出资料的内存.实际上,缓冲区也可以这样理解:在一个粮库中,由于装缷车队的速度要快于传送带的传输速度,为了不造成装缷车队的浪费,粮库设计了一个站台,装缷车队可以先将运送的粮食缷到这个平台上,然后让传送机慢慢传送.粮库的这个站台就起到了缓冲的作用.当满足以下三种情况之一,就会把缓冲区的内容写到客户端. JSP页面的输