2013年7月28日 星期日

Long Polling 之 很殘念的到了最近才知道啊...

是說這是第一篇文耶!!! (還不是某人真的讓這成了蚊子館XD

雖然標題是Long Polling來著
不過其實不全然是呢XDD (遭毆

以下正文(?


雖然這技術有段時間了
不過說真的不久前才剛知道啊XDD

得知起因莫名簡單的(?
主要是因為tlk.io這服務而起的XD
是個簡單的聊天室服務
雖然功能簡單樸素 不過技術倒不怎簡單啊www

存粹某天閒閒沒事對著他開了GC的開發者工具
(用了GC得到了這工具之後的習慣XD)
然後發現...
等... 竟然有個始終pending的連線? 而且status code還是101 !?
好奇的看了下URL... ws:// 這啥? 見都沒見過
所以就順手Google了一下...

恩... HTML5的新協議之一 WebSocket
原來這一直希望能有的東西被加進來啦OWO
恩... GC從6開始就有在實作了 (正確來說是4開始 不過貌似6才稍微比較完整?)
等... 咱看到啥了
咱可是只差最初的1沒用的GC死忠用戶啊(正式版前的版本無視XD)
老早就支援了咱竟然都沒注意到!!!!!!!!?
不過各瀏覽器支援仍然不大相同
看來還不適合實際使用
不過就像剛才說到的
tlk.io倒是用上啦XDD
(自然有其他fallback啦 不支援的狀況應該還是long polling)

然後這是新技術
自然會有對應的舊技術啦~~~
總不可能在哪邊每秒reload或者AJAX request的啊XD
(這就是polling 雖然之前確實這樣想的... OTZ
找資料的同時也發現了
除了polling這種爛到爆的方法外
還有comet&long polling
comet雖然可行 但終究不理想
所以就出現了long polling

這方法倒是意外的簡單說www
主要在伺服器端
收到客戶端的連線後就先丟著 讓他進入pending狀態
等到有資料要送的時候在送出去
而瀏覽器收到後就結束連線處理資料
然後又一個新的request送出繼續等待

不過這會有霸著連線的問題
自然得要靠event driven的後端
不然用apache連線直接被吃滿滿還要服務嗎XDD

照慣例的簡單試了下~~~
longpolling.php
<?php
$time = rand(2, 5);
sleep($time);
echo json_encode($time);
?>
longpolling.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
    function pull() {
        $.getJSON("longpolling.php", function(result) {
            $("#pullresult").append("<p>waiting time : "+result + "</p>");
            setTimeout(pull, 100);
        });
    }
    $(document).ready(function() {
         pull();
    });
    </script>
</head>
<body>
<div id="pullresult">
</div>
</body>
</html>
結果~~~

(上面只是示範 如果真的拿來用的話Web Server會炸掉的XDD)


說實話
還真是沒想到現在使用的技術是如此的簡單啊XDD
果然好方法真的不一定是複雜的方法呢www
不過還是期望WebSocket能盡速普及啦
畢竟相較之下仍然是個比較好的方法XD

不過實際上也有SPDY這個方案呢www
總之看狀況啦~~~
反正寫網頁還是要看使用者啦
(望向那令種網頁設計師反感的IE 不過最近也好很多啦XD