将Node.js(用于实时通知)添加到现有的PHP应用程序

20

我有一个现有的PHP应用程序,需要添加实时通知功能。为了实现这个目的,我安装了node.js(打算添加socket.io以支持所有实时功能)。

但是,尽管我花了最近三个小时研究和试图理解如何集成两者,但我发现自己离理解还没有更进一步。

我目前正在使用以下内容:

  • Apache
  • PHP
  • Nginx(作为所有静态内容(如图像/ CSS文件等)的反向代理到Apache)
  • MySQL

我已经编写了发送来自客户端的事件并将通知插入数据库的代码。当接收方刷新其页面时,他们当然会看到该通知。我只需要让node.js处理实时推送给客户端,但我不知道该如何设置它。

在这种情况下,我真正需要知道的是:

  1. 如何/何时实例化node.js/websocket连接到客户端,既然我仍希望所有内容都通过Apache/PHP提供?
  2. 如何从PHP发送消息到Node.js,并指示它将通知推送给客户端?
  3. 我需要对我的设置进行什么样的后端修改以支持此功能?

最终,我希望能够仅运行PHP函数并期望node.js/socket.io/websockets将通知推送给客户端。我只是不知道如何做到这一点。

感谢提前提供任何示例/信息/指南。


  1. 当客户端请求时;
  2. 通过HTTP传输;
  3. 配置nginx。
- Waleed Khan
你可以看看这个 - Supun Kavinda
@Supun Kavinda - 您的链接对于一般示例非常有帮助。问题在于它适用于连接到php文件的每个用户。如何将请求发送给不同的用户,而不是所有用户?比如说,有多个对话正在进行中。我能够在php上跟踪用户/对话,但如何将推送通知发送到websocket上的正确连接用户?在示例中,节点客户端ID只是整数,将它们与$ _SESSION变量相同?怎么做? - Zackattack
@Zackattack 你可以使用“通道(channels)”。最简单的方法是查看 Pusher 的API文档以了解它们的通道工作原理。你可以在你的WS服务器中实现类似的东西。(这很简单,你可以通过token或session进行身份验证)。然后,你可以从前端订阅频道。但是,我们不再使用Node.js: 我们使用了强大的Ratchet package在PHP中编写了我们的WS服务器。 - Supun Kavinda
感谢您的回复,我最初打算使用 Ratchet,但它似乎比 Node.js 更复杂。我花了几个小时尝试实现它,但进展不大。而在没有任何 Node.js 经验的情况下,我能够在不到 30 分钟内让 Node.js 正常工作。 - Zackattack
2个回答

17
在这种情况下,我会使用Socket.IO设置一个Node.js服务器。这为您提供了一种跨浏览器的方法,可以向客户端发送接近实时的数据。
当客户端加载您的PHP页面时,您将有一个指向Node.js服务器以加载Socket.IO的<script>标记。一旦加载完成,Socket.IO JavaScript客户端将连接到您的Node.js Socket.IO服务器并等待事件被发射。
现在,由于您希望这些事件从PHP中发送,因此您需要PHP应用程序和Node.js之间的通信渠道。我建议使用Redis pub/sub。基本上,您的PHP应用程序发布一条消息,已经订阅该消息的Node.js服务器将收到它。那些服务器随后可以立即向客户端传递一条消息,要求其从PHP获取更多数据。(我认为您会发现,让您的Node.js服务器首先发送该数据可能同样容易。)
如果您想要将Node.js放在Nginx服务器后面,但是您需要最新版本才能获得真正的WebSocket支持

1
这听起来非常完美,特别是因为我已经在使用Redis构建活动流。使用脚本标签的部分就像灯泡一样亮了起来。正是我想要的。非常感谢。 - gordyr
2
@user346665 这当然是一个选项,但使用发布/订阅模式实际上是在重新发明轮子,然后你还需要管理一份服务器的列表,以及处理你的 PHP 脚本将会挂起的事实(除非你使用 multicurl,但这对于这样的事情来说真的很麻烦)。 - Brad
但是如果我们只使用一个节点服务器,这是否是一个可行的解决方案? - user345602
@user346665 如果你没有计划在以后发展,那当然可以。 - Brad
1
@SOuřaanGřg 尽管我会收费咨询项目,但目前我的日程安排已经没有空余时间。另外,Stack Overflow并不是雇用顾问的合适场所。我建议在专门的网站上寻找知识渊博的顾问。 - Brad
显示剩余6条评论

0

这个问题很老了,但我在尝试实现WebSockets时找到了它,也许这会帮助其他需要纯PHP解决方案的人,而且可以轻松集成到现有项目中,无需太多的修改。

Ratchet - PHP WebSockets

唯一的要求是PHP的zmq绑定,它被用作从您的PHP脚本传递数据到您的websocket服务器的方法。如果您的PHP实例没有构建它,则可以在这里找到它

Github存储库在这里,有很多示例可以帮助您入门这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接