以聊天室為例子,說起寫聊天室,大家隨口都能說出個大概:
即每隔一段時間向伺服器非同步請求更新,用四個字母代替之就是AJAX。
其實我們轉念想想,我們使用AJAX的目的就是使頁面能即時地更新,倘若我們的動態網頁面能夠即時地更新,我們幹嘛還費這些周折?
先看一個小實驗:
1 <?php2 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=02 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個位元組以後才開始顯示該頁面,所以必鬚髮送一些額外的空格來讓這些瀏覽器顯示頁面內容。
至此我們已經用”伺服器推“解決了的即時更新的問題。其他架構也與普通思路無異,就不再累述了。
有興趣的同學可以著手寫一個了。呵呵。
歡迎大家一起交流。