使用Redis在PHP和socket.io/node.js之间进行通信

时间:2013-05-10 11:11:02

标签: php node.js redis socket.io

我在Apache上构建并运行了一个PHP应用程序,使用Nginx作为反向代理来提供静态资源。

我还安装了Redis,用于存储每个用户活动流的活动ID。该活动被写入MySQL数据库,然后Redis将活动ID推送到每个用户流中。当用户收到他/她的活动流时,应用程序首先从Redis检索活动ID的用户列表,然后通过MySQL IN()查询获取实际活动数据。

这一切都很好,但是我想开始为这个设置添加实时功能。我希望能够将这些事件直接推送到用户浏览器,并添加常规实时通知。

为此我已经用socket.io安装了node.js.我正确启动并运行了socket.io服务器,并在页面加载时自动连接客户端。

我正在努力学习如何从我的PHP应用程序中向socket.io发布消息。由于PHP和node.js无法直接通信,我的理解是我最好将Redis用作中间人,因为我已经安装并启动并运行它。但是我不知道该怎么做。

我需要的是从PHP发送通知到Redis然后再发送到socket.io以便将其推送到相关客户端的过程描述(任何代码示例都非常有用)。

另外,我不明白socket.io如何知道要发送到哪个客户端。我如何传递这些信息并保持一致?这甚至是必要的吗?我是否需要在Redis中存储我的PHP会话并让socket.io在用户连接时收集数据?或者还有另一种方式吗?

提前致谢。

请注意:我的PHP SESSION数据目前已保存到磁盘。

2 个答案:

答案 0 :(得分:1)

您可以在Redis上设置pubsub频道(请参阅http://redis.io/topics/pubsub)。然后从您的node.js进程订阅它。然后,您的PHP将发布到pubsub以与节点进行通信。您可以为不同的客户提供单独的pubsub频道,并发布到您接触特定客户所需的任何频道。

答案 1 :(得分:0)

Redis不提供内置的websocket或http服务器,所以我们必须将它与php或node.js集成,以便传输频道数据。使用Tweak方法,我们可以使用用于redis的predis php库连接Redis服务器和php,其中php将数据推送到Redis,socket.io将跟踪推送到Redis服务器的新消息并将其发送回与实际连接的用户时间。

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