PHP实现’服务器推’(flush函数使用)
最近一直在做自己的图书站,分别使用过杰奇和读吧两套不同的系统,对于这两套系统也是又爱又恨,爱的是他们的功能强大,恨他们都同属没有开源精神的产物。呵呵,作为一名穷程序员,俺可以理解作者的苦衷,这里就不批判了。年假期间,无事可做,翻看自己以前的采集代码,发现很多可以优化和提升的地方,就简单做了下优化,其中也使用了用户体验更加优秀的服务器推技术,这里简单的介绍下核心的函数: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函数来实现一个例子:
[*]<?php </li>
[*]for ($i=10; $i>0; $i--)
[*]{
[*]echo $i;
[*]flush();
[*]sleep(1);
[*]}
[*]?>
上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来,后面的输出开始正常。PHP手册中对此也做出了解释,就是各种缓存在起作用,那我们该如何解决呢?!
答案来了:^_^
一、
[*]<?php </li>
[*]ob_end_clean();//修改部分
[*]for ($i=10; $i>0; $i--)
[*]{
[*]echo $i;
[*]flush();
[*]sleep(1);
[*]}
[*]?>
二、
[*]<?php </li>
[*]for ($i=10; $i>0; $i--)
[*]{
[*]echo $i;
[*]ob_flush();//修改部分
[*]flush();
[*]sleep(1);
[*]}
[*]?>
写到这里,发现一个哥们的文章,比我写的更加透彻,在次引用:
剖析PHP中的输出缓冲
最近想整理下自己的代码,搞个专门的站点放着,暂定名为:毛毛虫的实验室
大家敬请期待,肯定都是好玩的东西,呵呵!
页:
[1]