posts - 101,  comments - 29,  trackbacks - 0

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

即每隔一段时间向服务器异步请求更新,用四个字母代替之就是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 on 2012-07-29 10:48 mixer-a 阅读(1243) 评论(1)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: