拋棄AJAX?! "服務器推"之初體驗


以聊天室為例子,說起寫聊天室,大家隨口都能說出個大概:

即每隔一段時間向服務器異步請求更新,用四個字母代替之就是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個字節以后才開始顯示該頁面,所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。

 

至此我們已經用”服務器推“解決了的實時更新的問題。其他框架也與普通思路無異,就不再累述了。

 

有興趣的同學可以着手寫一個了。呵呵。

 

歡迎大家一起交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM