抛弃AJAX?! "服务器推"之初体验

以聊天室为例子,说起写聊天室,大家随口都能说出个大概:

即每隔一段时间向服务器异步请求更新,用四个字母代替之就是AJAX。

 

其实我们转念想想,我们使用AJAX的目的就是使页面能实时地更新,倘若我们的动态页面能够实时地更新,我们干嘛还费这些周折?

 

先看一个小试验:

1 <?php
2 while(true){
3         echo 'Hello';
4         sleep (1000);
5 }
6 ?>

如果如我们所愿,则页面将每隔一秒都会显示一个‘hello’

 

看到这,也许知道我们聊天室的消息显示页面该怎么写了,请看伪代码。

 1 <?php
 2 $currentData = getData();
 3 while (true){
 4       $differences=getData();
 5       if ($differences!=$currentData){
 6                    echo $differences;
 7                    }
 8       sleep (10000);
 9 }
10 ?>

可惜光是这样是不能成功滴,因为我们还没考虑到php的缓存和缓冲问题。

 

php默认会缓存内容,防止http报文的Header和Data分离。且php会缓冲页面内容直至程序结束再将页面输出。

 

知道原因就好办了。好在php提供了关闭缓冲和缓存的方法。

直接在前面加上

1 output_buffering=0
2 ob_end_flush();
3 set_time_limit(0);

 

则变为:

 1 <?php
 2 output_buffering=0;
 3 ob_end_flush();
 4 
 5 while(true){
 6         echo 'Hello';
 7         sleep (1000);
 8         flush(); //强制使PHP输出
 9 }
10 ?>

你会发现第一个显示hello的已经成功了!

我们的消息页面就变为

 1 <?php
 2 output_buffering=0;
 3 ob_end_flush();
 4 
 5 $currentData = getData();
 6 while (true){
 7       $differences=getData();
 8       if ($differences!=$currentData){
 9                    echo $differences;
10                    flush();
11                    }
12       sleep (10000);
13 }
14 ?>

 

 

但是在项目最终的实现上,客户端也存在问题:

有些浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。 

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

 

至此我们已经用”服务器推“解决了的实时更新的问题。其他框架也与普通思路无异,就不再累述了。

 

有兴趣的同学可以着手写一个了。呵呵。

 

欢迎大家一起交流。

posted @ 2012-07-28 22:40  Goshin  阅读(2449)  评论(8编辑  收藏  举报