2013-05-10 52 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/

相关问题