先不去管後端用什麼實現,先說架構思路.
個人建議使用AJAX長輪詢(即HTTP長連線)來實現站內訊息通知.
因為HTTP協議的相容性比WebSocket好得多.
伺服器端則可以用PubSub釋出訂閱模式實現即時訊息通知,即:
使用者瀏覽器發起一個HTTP長連線,訂閱(subscribe)一個使用者頻道.
系統有訊息產生時,就往這個頻道釋出(publish)一條訊息.
這個使用者的瀏覽器的HTTP長連線的請求就會返回,把資料帶給使用者.
其中PubSub釋出訂閱中介軟體可以使用Redis.
伺服器可以使用傳統的PHP-FPM,或者非同步的Swoole和WorkerMan.
前端AJAX長輪詢可以這樣寫(基於jQuery):
後端自然就是使用PHP的Redis客戶端進行PubSub程式設計了.
區別在於phpredis和predis裡的subscribe訂閱操作是同步阻塞的,會佔用一個PHP程序.
而Swoole內建的基於hiredis的swoole_redis的subscribe訂閱操作則是非同步非阻塞的,不會阻塞一個PHP程序,但同樣會佔用一個Redis連線.
Swoole協程實現PubSub釋出訂閱的程式碼參考:
先不去管後端用什麼實現,先說架構思路.
個人建議使用AJAX長輪詢(即HTTP長連線)來實現站內訊息通知.
因為HTTP協議的相容性比WebSocket好得多.
伺服器端則可以用PubSub釋出訂閱模式實現即時訊息通知,即:
使用者瀏覽器發起一個HTTP長連線,訂閱(subscribe)一個使用者頻道.
系統有訊息產生時,就往這個頻道釋出(publish)一條訊息.
這個使用者的瀏覽器的HTTP長連線的請求就會返回,把資料帶給使用者.
其中PubSub釋出訂閱中介軟體可以使用Redis.
伺服器可以使用傳統的PHP-FPM,或者非同步的Swoole和WorkerMan.
前端AJAX長輪詢可以這樣寫(基於jQuery):
後端自然就是使用PHP的Redis客戶端進行PubSub程式設計了.
區別在於phpredis和predis裡的subscribe訂閱操作是同步阻塞的,會佔用一個PHP程序.
而Swoole內建的基於hiredis的swoole_redis的subscribe訂閱操作則是非同步非阻塞的,不會阻塞一個PHP程序,但同樣會佔用一個Redis連線.
Swoole協程實現PubSub釋出訂閱的程式碼參考: