posts - 101,  comments - 29,  trackbacks - 0

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

          即每隔一段時(shí)間向服務(wù)器異步請求更新,用四個(gè)字母代替之就是AJAX。

           

          其實(shí)我們轉(zhuǎn)念想想,我們使用AJAX的目的就是使頁面能實(shí)時(shí)地更新,倘若我們的動(dòng)態(tài)頁面能夠?qū)崟r(shí)地更新,我們干嘛還費(fèi)這些周折?

           

          先看一個(gè)小試驗(yàn):

          復(fù)制代碼
          1 <?php 2 while(true){ 3         echo 'Hello'; 4         sleep (1000); 5 } 6 ?>
          復(fù)制代碼

          如果如我們所愿,則頁面將每隔一秒都會顯示一個(gè)‘hello’

           

          看到這,也許知道我們聊天室的消息顯示頁面該怎么寫了,請看偽代碼。

          復(fù)制代碼
           1 <?php  2 $currentData = getData();  3 while (true){  4       $differences=getData();  5       if ($differences!=$currentData){  6                    echo $differences;  7                    }  8       sleep (10000);  9 } 10 ?>
          復(fù)制代碼

          可惜光是這樣是不能成功滴,因?yàn)槲覀冞€沒考慮到php的緩存和緩沖問題。

           

          php默認(rèn)會緩存內(nèi)容,防止http報(bào)文的Header和Data分離。且php會緩沖頁面內(nèi)容直至程序結(jié)束再將頁面輸出。

           

          知道原因就好辦了。好在php提供了關(guān)閉緩沖和緩存的方法。

          直接在前面加上

          1 output_buffering=0 2 ob_end_flush(); 3 set_time_limit(0);

           

          則變?yōu)?

          復(fù)制代碼
           1 <?php  2 output_buffering=0;  3 ob_end_flush();  4   5 while(true){  6         echo 'Hello';  7         sleep (1000);  8         flush(); //強(qiáng)制使PHP輸出  9 } 10 ?>
          復(fù)制代碼

          你會發(fā)現(xiàn)第一個(gè)顯示hello的已經(jīng)成功了!

          我們的消息頁面就變?yōu)?/p>

          復(fù)制代碼
           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 ?>
          復(fù)制代碼

           

           

          但是在項(xiàng)目最終的實(shí)現(xiàn)上,客戶端也存在問題:

          有些瀏覽器也會在顯示之前,緩存接收到的內(nèi)容。例如 Netscape 瀏覽器會在接受到換行或 html 標(biāo)記的開頭之前緩存內(nèi)容,并且在接受到 </table> 標(biāo)記之前,不會顯示出整個(gè)表格。 

          IE甚至只有當(dāng)接受到的256個(gè)字節(jié)以后才開始顯示該頁面,所以必須發(fā)送一些額外的空格來讓這些瀏覽器顯示頁面內(nèi)容。

           

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

           

          有興趣的同學(xué)可以著手寫一個(gè)了。呵呵。

           

          歡迎大家一起交流。

          posted on 2012-07-29 10:48 mixer-a 閱讀(1257) 評論(1)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 班戈县| 浦北县| 兴文县| 泽库县| 北辰区| 集安市| 乌兰察布市| 洛扎县| 敖汉旗| 屏东县| 娄烦县| 平阴县| 宜昌市| 阿克苏市| 敖汉旗| 巴彦淖尔市| 体育| 乐清市| 庆城县| 涞源县| 平利县| 遂昌县| 克东县| 淮北市| 内乡县| 南溪县| 蓬安县| 遂昌县| 启东市| 青铜峡市| 龙游县| 嘉义县| 会昌县| 孙吴县| 定安县| 关岭| 东丰县| 阳新县| 金塔县| 大关县| 通州区|