2014-01-13 66 views
0

我在CodeIgniter框架中有一個PHP應用程序,運行在具有MySQL數據庫的Apache服務器上。有很多數據庫通信,都是通過抽象層完成的。這是一個遊戲應用程序,當用戶打開頁面時,使用PHP從MySQL中獲取帶有一些額外信息的開放遊戲列表,並顯示在頁面上。現在,我需要設置它,以便列表更新。我需要一個websockets服務器,因爲當我使用Ajax時,延遲太大了,我決定使用Node.js + sockets.io來實現。我並不需要每次聯繫數據庫,我都可以根據客戶端上的用戶操作更新列表。從PHP發送結構化數據到沒有HTTP的Node.js?

這就是我卡住的地方 - 第一次用PHP加載列表後,如何將它發送給Node.js?我發現一個解決方案涉及發送HTTP請求用於此目的,但這似乎是多餘的,因爲此時,我已經將所有數據顯示在客戶端上。

下面是一些樣本數據,在PHP數組被顯示在頁面上之前:

array(2) { [0]=> object(stdClass)#19 (6) { ["id"]=> string(1) "1" ["admin_id"]=> string(1) "2" ["start_date"]=> string(19) "2013-11-18 07:19:46" ["status"]=> string(1) "1" ["username"]=> string(15) "Marko Marković" ["option"]=> string(5) "start" } [1]=> object(stdClass)#20 (6) { ["id"]=> string(1) "2" ["admin_id"]=> string(1) "3" ["start_date"]=> string(19) "2013-11-18 07:20:32" ["status"]=> string(1) "1" ["username"]=> string(13) "Dzoni Noksvil" ["option"]=> string(5) "start" } } 

有沒有一種方法,我可以在客戶端打包這件事,然後就都節點從挑數據向上客戶端,所以不需要將數據從PHP直接發送到Node?

+0

爲什麼不使用救護車,做你的WebSockets服務器 - 在PHP中的東西? – Pointy

+0

因爲我花了一個星期的時間試圖讓Ratchet在我的服務器上工作,在這個過程中又問了兩個人的幫助,堆棧溢出沒有任何幫助,最後,我放棄了,因爲它不工作,沒有需要說明的文檔,即使我能夠使用它,我也不希望被一種沒有真正的在線支持的技術所困住,以免再次遇到問題。這一切似乎都很脆弱。 – jovan

+0

這是一個體面的服務器,以防萬一http://www.4shared.com/rar/7RIos1tuce/PHPWebSocket-Chat-master.html –

回答

0

您可以使用庫進行進程間通信,如Apache Thrift。有Node和PHP的綁定。但是,如果這一切都在一臺服務器上運行,並且您想讓事情變得非常簡單,那麼您可以讓PHP寫入一個文件(可能序列化爲JSON)並讓Node使用該文件。

2

如果您所有的域邏輯都存在於PHP中,並且您只是想將最終數據集發送到節點(或任何語言),我會考慮這樣做: 使用Message Queue或Message Broker。

您正在試圖做到這一點:

PHP 
    | 
Node.js 

考慮一下:

PHP 
| 
Message Queue 
| 
Node.js 

一旦你有兩種語言的溝通變得容易之間的通用接口。 PHP可以將完成的東西推送到您的隊列中,並且node.js可以將其選中以供使用。如果你決定走這條路線,請用你的發現更新你的文章,很想聽聽它是如何發展的。

+0

我會研究一下,以及Apache Thrift(在其他答案中提到)。研究這件事需要一段時間,我會在有需要補充的時候在這裏發帖。 – jovan

+0

ZeroMQ比RabbitMQ更適合您的需求。 RabbitMQ假設一個複雜的消息傳遞拓撲結構,並且支持它,但它對於你想要做的事情來說過於誇張。 ZeroMQ提供了簡單的構建模塊,可以根據需要構建簡單或複雜的通信系統,它只是抽象出建築物連接的真正低級別方面。 – Jason

+0

我現在正在觀看視頻,在我看來,如果我使用ZeroMQ,我可以完全跳過節點,不是嗎?如果我理解正確,我可以爲ZeroMQ執行PHP綁定,然後在「永久iframe」中使用Pub/Sub功能來持續更新所有連接的客戶端。我錯過了什麼嗎? – jovan