實作實時通信一般有兩種方式:
socket或comet。socket是比較好的解決方案,問題在于不是所有的浏覽器都相容,伺服器端實作起來也稍微有點麻煩。相比之下,comet(基于HTTP長連接配接的"伺服器推")實作起來更加友善,而且相容所有的浏覽器。是以這次就來說說comet的php實作。
comet也有好幾種實作方式,如iframe, http long request,本文主要探讨http long request實作實時通信。
先說說http長連結是怎麼回事,通俗點講就是伺服器不是一收到請求就直接吐資料,而是在那憋啊憋,一直憋到憋不住了,才告訴你執行結果。
至于憋多長時間,就看具體應用了,如果憋太久的話,伺服器資源的占用也會是個問題。
現在我們就要通過這種方法來實作實時通信(其實是準實時),先說一下原理:
1. 用戶端發起一個ajax長連結查詢,然後服務端就開始執行代碼,主要是檢查某個檔案是否被更新,如果沒有,睡一會(sleep),醒來接着檢查
2.
如果用戶端又發起了一個查詢連結(正常請求),服務端收到後,處理請求,處理完畢後更新某個特定檔案的modify time
3.
這時第一次ajax查詢的背景代碼還在執行,發現某個檔案被更新,說明來了新請求,輸出對應的結果
4.
第一次ajax查詢的callback被觸發,更新頁面,然後再發起一個新的ajax長連結
最後,話說,php真不适合幹這個,我覺得用nodejs 寫是最輕松的,erlang好像也不錯