本文非原創,點擊查看原帖
很多程式都可以通過socket來實現長串連,實現訊息的即時推送。但由於http請求一般都是短串連,一次請求結束,就會斷開與伺服器的串連,伺服器不能主動推送資料到用戶端,而只能由用戶端發起請求,但有些時候,需要在web上實現即時的訊息傳輸,比如即時聊天、股票動態資訊等。
在Ajax技術被發掘以前,在網頁上實現無重新整理的即時聊天,似乎是很困難的事情,但由於Ajax技術的興起,人們可以進一步來挖掘它的潛力了,象gmail、google gtalk的網頁版,都是Ajax長串連的重要應用,目前很多網站可能都已經在使用長串連技術了,比如SNS網站的即時聊天。
1.Ajax短串連方式實現網頁聊天
自己畫了一個模型圖:
常規的短串連模式下,都是通過不間斷重新整理請求實現的,比如每間隔3秒發送一次Ajax請求,3秒更新一下資料,然後就這樣不間斷重新整理下去,直到使用者關閉網頁。這樣所帶來的弊端就是,如果使用者很長時間都沒有操作,每次重新整理都不會返回新資料,這樣就造成了資源的浪費,很多請求都是沒必要的;另外一個問題,就是使用者的輸入,跟資料的請求不是同步的,會造成一定的資訊延遲。
2.Ajax長串連方式實現網頁聊天
模型圖:
Ajax長串連模式,它的重新整理是根據資料來執行的,如果有新資料返回,接收並解析顯示資料,然後發起新的Ajax請求,如果一段時間內,使用者沒有操作,則串連處於睡眠狀態,一直等待有使用者輸入或者請求逾時,然後發起下個Ajax請求。這樣做的好處是,每個訊息都會即時推送到用戶端,延遲極少;另外每次請求都是有意義的,與短串連對比,效率要高很多。但對於一個使用者量很多,並且操作非常頻繁的網站,長串連模式也會出現過於頻繁的重新整理問題。目前IE對於HTTP串連數是有限制的,每個網頁只能同時進行兩個長串連,第三個長串連會被阻塞。
利用php在後台sleep,自己做了個類比的程式,查看效果
看了一下別人寫的Ajax長串連聊天的案例,以php為例,基本上是在後台進行不間斷的檢測,如果有新資料就推送,如果沒有新資料,就一直阻塞,直到30秒逾時,然後用戶端重新發起下一個請求。後台判斷裡重要的一行代碼:usleep(10000); 就是暫停10毫秒,緩解一下CPU壓力,個人感覺如果暫停100毫秒,時間延遲也是很難感覺到的。這種方法基本就是把前端的迴圈,搬到了後台,中間減少了網路傳輸的環節,如果是一個Ajax的即時聊天系統,要儲存使用者的聊天記錄,那就需要跟資料庫相結合,每秒10次以上的資料查詢,這個與短串連比,必定加大了資料庫的壓力,具體怎麼最佳化,這個應該是交給伺服器端人員來處理了。
如果想要瞭解更多的內容請Google一下comet,或者看看這裡(一個很不錯的架構,Ajax Push Engine),這個網站有很多demo,效果很帥。