PHP实现‘服务器推’(flush函数使用)

Filed under: PHP&MySQL |
Posted on

最近一直在做自己的图书站,分别使用过杰奇和读吧两套不同的系统,对于这两套系统也是又爱又恨,爱的是他们的功能强大,恨他们都同属没有开源精神的产物。呵呵,作为一名穷程序员,俺可以理解作者的苦衷,这里就不批判了。
年假期间,无事可做,翻看自己以前的采集代码,发现很多可以优化和提升的地方,就简单做了下优化,其中也使用了用户体验更加优秀的服务器推技术,这里简单的介绍下核心的函数:flush。

先看看手册中的解释:
flush — 刷新输出缓冲;
说明:
void flush ( void )
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。

flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。

个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到

标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

根据上面的解释,我们简单的使用flush函数来实现一个例子:

  1. <?php
  2. for ($i=10; $i>0; $i--)
  3. {
  4.     echo $i;
  5.     flush();
  6.     sleep(1);
  7. }
  8. ?>

上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来,后面的输出开始正常。PHP手册中对此也做出了解释,就是各种缓存在起作用,那我们该如何解决呢?!
答案来了:^_^
一、

  1. <?php
  2. ob_end_clean();//修改部分
  3. for ($i=10; $i>0; $i--)
  4. {
  5.     echo $i;
  6.     flush();
  7.     sleep(1);
  8. }
  9. ?>

二、

  1. <?php
  2. for ($i=10; $i>0; $i--)
  3. {
  4.     echo $i;
  5.     ob_flush();//修改部分
  6.     flush();
  7.     sleep(1);
  8. }
  9. ?>

写到这里,发现一个哥们的文章,比我写的更加透彻,在次引用:
剖析PHP中的输出缓冲
最近想整理下自己的代码,搞个专门的站点放着,暂定名为:毛毛虫的实验室
大家敬请期待,肯定都是好玩的东西,呵呵!

Tags : , , ,   阅读次数: 9

3 Responses to “PHP实现‘服务器推’(flush函数使用)”

  1. chris

    ob_flush 和 flush必须同时使用

  2. 银子

    博客搬家。域名现为:www.zdyi.com 原域名:www.loai.cn不再使用

    麻烦改一下吧.

  3. AndyLau

    Are you sure that your article is about the server push tech implemented by php??

Leave a Reply