2013-05-10 88 views
7

我有一個在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數據當前保存到磁盤。

+0

一下怎麼樣在Redis的一個發佈訂閱頻道,並從您的node.js過程訂閱它。然後您的PHP將發佈到pubsub以與節點進行通信。您可以爲不同的客戶設置不同的pubsub頻道,併發布到您需要聯繫特定客戶的任何頻道。 – akonsu 2013-05-10 18:01:04

+0

@akonsu這正是我最終做的感謝。不過,我只設置了一個pubsub頻道,並將所有內容發佈到socket.io中。在那裏我計算出它應該去哪個特定的客戶端等等......我會爲每個連接的客戶端定義一個單獨的pubsub頻道嗎?另外如果你想寫這個我更多的細節作爲答案,我會標記它是正確的。 :) – gordyr 2013-05-11 05:28:41

+0

老實說,我不知道爲每個用戶創建一個單獨的頻道。這取決於用戶的數量。它可能不會縮放。但我一定會記住有幾個渠道的可能性。有一天,當你的用戶羣增長時,你可以擁有許多相關的redis實例,並將你的頻道分割給他們。 – akonsu 2013-05-13 04:30:21

回答

1

您可以在Redis上設置pubsub頻道(請參閱http://redis.io/topics/pubsub)。然後從你的node.js進程訂閱它。然後您的PHP將發佈到pubsub以與節點進行通信。您可以爲不同的客戶設置單獨的pubsub頻道,併發布到您需要聯繫特定客戶的任何頻道。

+2

請附上一個來源鏈接,使其更清晰... – tong 2015-08-10 16:09:08

+0

謝謝。添加了一個鏈接。 – akonsu 2015-08-10 16:49:07

0

Redis不提供內置websocket或http服務器,因此我們必須將它與php或node.js集成以便流式傳輸通道數據。使用Tweak方法,我們可以使用predis php library for redis連接Redis服務器和php,其中php會將數據推送到Redis中,socket.io將跟蹤推送到Redis服務器的新消息,並將其返回給實際連接的用戶時間。

https://github.com/u-day/tweak/

相關問題