標籤:
comet反向Ajax模型原理與模型(筆記一)
網頁即時聊天有兩種方式:
第一種:不斷的查詢是否有新訊息,耗費資源,並非真正的即時
第二種:使用反向Ajax,頁面不斷開,一有資料就立即發送,真正的即時
我們先簡單做一個頁面不斷開的瀏覽器頁面:
1 ob_start(); 2 3 <?php 4 5 /* 反向Ajax原理 6 7 * comet 反向ajax 8 9 * 又叫伺服器推技術 server push10 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小塊chunk28 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把內容發給apache58 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小塊chunk14 * 具體做法: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把內容發給apache23 //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把內容發給apache46 //flush(); //強迫webserver把內容發給瀏覽器47 //sleep(1);48 }49 /*50 思路:51 1:在正常的頁面裡,如首頁,文章等等,嵌套一個iframe52 這個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的不斷開的聊天系統
comet反向Ajax模型原理與模型(筆記一)