AJAX輪詢與WebSocket怎麼選?

Thread Source: LightChat 轻量客服聊天室 PHP源码

說到即時聊天系統的技術選型,很多人第一反應就是「當然用 WebSocket 啊」,但真的是這樣嗎?就拿前面那套免 WebSocket 的在線客服系統來說,它跑在普通虛擬主機、寶塔環境上,靠的就是 AJAX 輪詢。這其實點出了一個很實際的問題:不是所有場景都適合 WebSocket,選錯了反而給自己挖坑。

AJAX 輪詢到底是怎麼運作的

簡單講,AJAX 輪詢就是前端每隔一段時間(比方說 2 秒)主動問伺服器一次:「有新訊息嗎?」有就拿回來,沒有就下次再問。聽起來有點笨,對吧?但它的最大優勢是——相容性極好。PHP 7.4、MySQL、無框架、無 Composer,連寶塔面板都能直接跑,不用額外裝 Node.js 或配置長連接服務。對中小型客服系統、留言板這種並發量不高的場景,這套方案部署成本低到讓人安心。

WebSocket 的優勢與代價

WebSocket 走的是全雙工長連接,伺服器有新訊息能「主動推」給前端,延遲通常在毫秒級,而且省掉了反覆建立 HTTP 連接的開銷。高併發的場景下,像是上千人同時在線的直播彈幕、多人協作白板、股票行情推送,WebSocket 幾乎是唯一解。

但代價也很現實。它需要伺服器端常駐進程,普通共享虛擬主機往往不支援;還得處理斷線重連、心跳保活、負載均衡時的連接黏滯問題。你以為省了輪詢的流量,結果運維複雜度翻了好幾倍。

那到底怎麼選?

我的經驗是這樣——先問自己兩個問題:你的同時在線人數大概多少?你的伺服器環境能不能跑長連接?

  • 在線人數幾十到一兩百、環境是共享主機或寶塔:AJAX 輪詢完全夠用,別自討苦吃。
  • 需要毫秒級推送、併發上千、有獨立伺服器或雲主機:那就上 WebSocket。

還有個折衷方案常被忽略:長輪詢(Long Polling)。它讓請求「掛」在伺服器端直到有新資料才返回,介於兩者之間,延遲比普通輪詢低,又不需要 WebSocket 那套基建。

說到底,技術沒有高低之分,只有合不合適。前面那套客服系統選 AJAX 輪詢,不是技術落後,而是精準匹配了「普通虛擬主機也能跑」這個核心需求。工程師最該戒掉的,恰恰是「唯新技術論」的執念。

評論(6)

提示:請文明發言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

  • The Pickle Whisperer 普通用户

    之前也遇過同樣的窘境,虛擬主機不能跑常駐進程,最後只能乖乖用輪詢,能用就好

    1 週前 Reply
  • 愤世嫉俗 普通用户

    所以大概是幾百人同時在線才會需要換 WebSocket?想有個大概的參考值

    7 天前 Reply
  • 圍巾 普通用户

    長輪詢聽起來不錯,但實際部署上有比普通輪詢複雜很多嗎

    6 天前 Reply
  • 螃蟹仔 普通用户

    真的,一堆專案根本沒到那個量級就先被 WebSocket 的維運搞死,選擇適合的比較重要

    4 天前 Reply
  • 棉花心 普通用户

    「唯新技術論」這個詞真貼切,工具順手比趕流行重要多了

    2 天前 Reply
  • 檸檬茶 普通用户

    輪詢的間隔時間要怎麼抓也是門學問,設太短怕把伺服器打爆,設太長又怕訊息太頓

    2 天前 Reply