comet反向Ajax模型原理与模型(笔记一)
comet反向Ajax模型原理与模型(笔记一)
网页实时聊天有两种方式:
第一种:不断的查询是否有新消息,耗费资源,并非真正的实时
第二种:使用反向Ajax,页面不断开,一有数据就立即发送,真正的实时
我们先简单做一个页面不断开的浏览器页面:
1 ob_start(); 2 3 <?php 4 5 /* 反向Ajax原理 6 7 * comet 反向ajax 8 9 * 又叫服务器推技术 server push 10 11 * 在"实时聊天","消息推送"中,比较适宜用这种技术 12 13 * 服务器端: 14 15 * 1:不要断开连接 16 17 * 2:有消息时在发送 18 19 * 20 21 * 原理:HTTP/1.1 的长度与chunk传输 22 23 * chunk有切割分块的意思 24 25 * 就是说-----服务器也不知道到底要传输多少length给浏览器 26 27 * 只能每次传 1小块chunk 28 29 * 具体做法: 30 31 * php用一个死循环,始终运行 32 33 * 有相关消息时,立即把内容推到浏览器 34 35 * */ 36 37 ob_clean(); 38 39 set_time_limit(0); //脚本运行不受限制 40 41 $i = 0; 42 43 44 45 $conn = mysql_connect(‘localhost‘,‘root‘,‘‘); 46 47 mysql_query(‘use test‘,$conn); 48 49 mysql_query(‘set names utf8‘,$conn); 50 51 52 53 while(1){ 54 55 echo $i++,‘<br/>‘; 56 57 ob_flush(); //强迫php把内容发给apache 58 59 flush(); //强迫webserver把内容发给浏览器 60 61 sleep(1); 62 63 } 64 65 ?>
可以发现页面一直在不断的打印数据,页面没有断开
下面我们就用在上面的基础上做一个简单的实时聊天模型:
我们利用数据库作为消息存储端,服务器不断的查询数据库,一旦有新的消息,就立即打印出来(模拟数据发送成功)
1 ob_start(); 2 <?php 3 /* 反向Ajax原理 4 * comet 反向ajax 5 * 又叫服务器推技术 server push 6 * 在“实时聊天”,“消息推送”中,比较适宜用这种技术 7 * 服务器端: 8 * 1:不要断开连接 9 * 2:有消息时在发送 10 * 原理:HTTP/1.1 的长度与chunk传输 11 * chunk有切割分块的意思 12 * 就是说-----服务器也不知道到底要传输多少length给浏览器 13 * 只能每次传 1小块chunk 14 * 具体做法: 15 * php用一个死循环,始终运行 16 * 有相关消息时,立即把内容推到浏览器 17 * */ 18 ob_clean(); 19 set_time_limit(0); //脚本运行不受限制 20 $i = 0; 21 //echo str_repeat(‘ ‘,4000),‘<br/>‘; 22 //ob_flush(); //强迫php把内容发给apache 23 //flush(); //强迫webserver把内容发给浏览器 24 //ob_get_clean(); //获取当前缓存区内容,并且 25 26 $conn = mysql_connect(‘localhost‘,‘root‘,‘‘); 27 mysql_query(‘use test‘,$conn); 28 mysql_query(‘set names utf8‘,$conn); 29 while(1){ 30 31 $sql = ‘select * from msg where name ="LoverXueEr" and isread = 0‘; 32 $rs = mysql_query($sql,$conn); 33 $msg = mysql_fetch_assoc($rs); 34 if(!empty($msg)){ 35 echo "<b>",$msg[‘name‘],"</b> \t",strftime("%d/%m/%Y %H:%M:%S"),"<br/>"; 36 echo $msg[‘content‘],‘<br/>‘; 37 38 $sql = " update msg set isread = 1 where name= ‘".$msg[‘name‘]."‘ && content= ‘".$msg[‘content‘]."‘ && num= ".$msg[‘num‘]; 39 mysql_query($sql,$conn); 40 ob_flush(); 41 flush(); 42 } 43 44 //echo $i++,‘<br/>‘; 45 //ob_flush(); //强迫php把内容发给apache 46 //flush(); //强迫webserver把内容发给浏览器 47 //sleep(1); 48 } 49 /* 50 思路: 51 1:在正常的页面里,如首页,文章等等,嵌套一个iframe 52 这个iframe使用上面的模型 53 2:这个iframe将不断得到服务器推送的消息 54 3:让iframe得到的消息是<script></script>代码 55 4:让iframe中的js影响到父页面的变化(如聊天窗口) 56 */ 57 ?>
先贴上实验结果图:
我们使用
insert into msg(name,isread,content) value(‘LoverXueEr‘,0,‘hello‘);
向数据库写入数据来模拟发送
可以发现我们每次insert,浏览器上就立即显示我们发送的数据,达到了真正的实时
明天,我们就开始正式学习反向Ajax的不断开的聊天系统
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。