当前位置:首页 > 编程技术 > PHP编程 > 正文内容

PHP中刷新输出缓冲

曾经2周前 (05-07)PHP编程100

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()来发送到浏览器了。

以下是举例:

  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个字节之后才开始显示。 以上代码还有以下两种写法。

  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. ?>  


  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类似函数如下


扫描二维码推送至手机访问。

版权声明:本文由珍惜发布,如需转载请注明出处。

本文链接:https://www.zp68.com/article/61.html

分享给朋友:

“PHP中刷新输出缓冲” 的相关文章

PHP将两个MP3文件进行合并,可以多个MP3文件合并

以下代码是基于PHP 7.x 的,版本小于7.x 的请自行将 代码中的__construct 改为 mp3<?php class mp3 { var $str; var $time; var $frames; // ...

PHP多数组组合-颜色尺码大小

抽象一下需求:在构建某个对象时,它拥有多个属性,每个属性拥有多个可选的值,需要穷举出每个属性不同的选择组合构建出的不同对象,比如:输入参数:$arr = [     'Name' => ['...

php实现边执行边输出的效果

客户端的请求到web服务器,web服务器再调用PHP代码;PHP返回内容到web服务器,web服务器再返回给客户端边执行边输出就需要web服务器和PHP都不缓存内容首先, Nginx不缓存PHP返回的内容header('X-Accel-Buffering: no'...

PHP 多线程 curl_multi_init 的使用 PK curl_init 看看那个更快

php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。本案例用来测试大并发的情况下 curl_multi_init() 到底比 curl_init() 快多少。话不多少,直接上...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。