以聊天室为例子,说起写聊天室,大家随口都能说出个大概:
即每隔一段时间向服务器异步请求更新,用四个字母代替之就是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) 编辑 收藏