我有一個在Apache上構建和運行的PHP應用程序,使用Nginx作爲反向代理來提供靜態資源。使用Redis在PHP和socket.io/node.js之間進行通信
我還安裝了Redis,用於存儲每個用戶活動流的活動ID。活動被寫入MySQL數據庫,然後Redis將活動ID推送到每個用戶流中。當用戶收到他/她的活動流時,應用程序會首先從Redis中檢索活動標識的用戶列表,然後通過MySQL IN()
查詢獲取實際活動數據。
這一切工作得很好,但我想開始添加實時能力到這個設置。我希望能夠將這些事件直接推送到用戶瀏覽器,並添加一般的實時通知。
爲此,我使用socket.io安裝了node.js。我的socket.io服務器正常運行並且客戶端在頁面加載時自動連接。
我在掙扎的地方在於理解如何從我的PHP應用程序中發佈消息到socket.io。由於PHP和node.js不能直接通信,因此我的理解是,由於我已經安裝並啓動並運行,因此我最好將Redis作爲中介。但我不知道如何去做這件事。
我需要的是對過程的描述(任何代碼示例將是非常有益)發送從PHP到Redis的通知,然後進入以便其推送到相關的客戶端socket.io。
此外,我不明白socket.io如何知道發送到哪個客戶端。我將如何傳遞這些信息並保持所有內容的同步?這甚至是必要的嗎?我是否需要將我的PHP會話存儲在Redis中,並且在用戶連接時讓socket.io收集數據?還是有另一種方式?
在此先感謝。
請注意:我的PHP SESSION數據當前保存到磁盤。
一下怎麼樣在Redis的一個發佈訂閱頻道,並從您的node.js過程訂閱它。然後您的PHP將發佈到pubsub以與節點進行通信。您可以爲不同的客戶設置不同的pubsub頻道,併發布到您需要聯繫特定客戶的任何頻道。 – akonsu 2013-05-10 18:01:04
@akonsu這正是我最終做的感謝。不過,我只設置了一個pubsub頻道,並將所有內容發佈到socket.io中。在那裏我計算出它應該去哪個特定的客戶端等等......我會爲每個連接的客戶端定義一個單獨的pubsub頻道嗎?另外如果你想寫這個我更多的細節作爲答案,我會標記它是正確的。 :) – gordyr 2013-05-11 05:28:41
老實說,我不知道爲每個用戶創建一個單獨的頻道。這取決於用戶的數量。它可能不會縮放。但我一定會記住有幾個渠道的可能性。有一天,當你的用戶羣增長時,你可以擁有許多相關的redis實例,並將你的頻道分割給他們。 – akonsu 2013-05-13 04:30:21