2012-10-14 72 views
2

我正在PHP中構建一個網站,它以JSON格式處理Redis中的會話。通過在php網站上的socket.io發出的通知

這種方式可以通過PHP解釋器和node.js服務器訪問會話。

我想要做的是現在在上述網站中添加通知;我想到的程序如下:(只是把它看作是一個簡單的朋友請求來簡化它)

  1. 用戶A發送好友請求。
  2. PHP使用捲曲要說到的node.js服務發送通知
  3. 用戶B得到通知,因爲他是通過socket.io

什麼一般準則,以實現這個連接的node.js ?因爲看起來很清楚,如果用戶A和B位於不同的服務器中,則無法水平擴展;

在此先感謝。

回答

1

聽起來像一個你可以在這裏使用Web套接字與發佈/訂閱協議,體系結構。

您可以使用Web套接字獲得服務器客戶端功能。 節點是websocket服務器的完美選擇,許多小型IO。 請參閱http://en.wikipedia.org/wiki/Web_sockets

我不會認爲如果共享會話是php-node通信所需的,只需讓客戶端通過套接字推送請求並根據需要處理這些回覆。

+0

我已經知道我需要使用網絡套接字;實際上我提到了socket.io。我的問題更多的是「僞代碼」類型,因爲我對socket.io的處理非常困難,特別是在可伸縮性方面。 –

+0

對不起,第一次閱讀。保持套接字服務器不知道會話可能是有益的。您的縮放問題在哪裏? – daxroc

+0

我雖然會話很重要,讓節點知道誰發送消息?如我錯了請糾正我。問題是,如果兩個用戶位於兩個不同的節點服務器上,那麼服務器a如何將消息發送到服務器b? –

0

我認爲你提出的方法聽起來很合理。但是,可以考慮使用消息隊列(zeromq,rabbitmq,其他),而不是直接請求服務,這樣可以更輕鬆地進行擴展,因爲您可以輕鬆地將邏輯添加到隊列處理以將消息傳遞給正確的節點實例。

我設法在便宜的VPS上用socket.io獲得了1400個併發連接,沒有特殊的配置,所以即使沒有任何技巧,它應該可以很好地擴展。在我的情況下,大多數這些連接也幾乎不斷地發送和接收數據。它可能處理的不止於此,1400'ish只是我碰巧得到的最大用戶數。

雖然我更擔心的是第一個獲得所有這些使用者)

+0

是的,我明白這個方法是正確的,問題在於我剛剛走了那麼遠,不知道如何實現代碼。如果你能用一些僞代碼來幫助我,那會很棒。 –

0

使用Redis的內置的發佈 - 訂閱功能。當PHP服務器收到請求時,它將它發佈到爲此設置的頻道。每個節點服務器都訂閱該通道並檢查涉及的用戶是否已連接到該通道。如果是這樣,它通過socket.io發送通知。作爲獎勵,您避免了額外的網絡連接,並簡化了您的整體邏輯。

0

只需根據需要設置你的數據庫,然後每當一個活動做出只是告訴你的節點js通過redis將相關信息轉移到php並創建一個進程,並通過頻道從php到節點作出響應繼續檢查從表格和顯示通知