【问题标题】:Adding Node.js (for real-time notifications) to an existing PHP application将 Node.js(用于实时通知)添加到现有 PHP 应用程序
【发布时间】:2013-05-09 23:12:43
【问题描述】:

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

但是。尽管过去三个小时都在研究并试图弄清楚如何将两者结合起来,但我发现自己并没有更接近理解。

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

  • 阿帕奇
  • PHP
  • Nginx(作为 Apache 的反向代理,用于所有静态内容,例如 图片/css 文件等)
  • MySQL

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

鉴于这种情况,我真正需要知道的是:

  1. 如何/何时实例化到客户端的 node.js/websocket 连接,给定 我希望所有内容仍然通过 Apache/PHP 提供吗?
  2. 如何从 PHP 向 Node.js 发送消息并指示它推送 通知给客户?
  3. 为了支持这一点,我需要对我的设置进行哪些后端修改?

最终,我希望能够简单地运行 PHP 函数并期望 node.js/socket.io/websockets 将通知推送到客户端。我只是不知道怎么去那里。

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

【问题讨论】:

  • 1.当客户请求时; 2.Through HTTP; 3.Set up nginx.
  • 你可以去this看看
  • @Supun Kavinda - 您的链接对于一般示例很有帮助。问题是它适用于每个连接到 php 文件的用户。如何将请求发送给不同的用户,而不是全部?比如说,进行不止一次的对话。我能够跟踪 php 上的用户/对话,但是如何将推送通知发送给 websocket 上正确连接的用户?在示例中,节点客户端 ID 只是整数,使它们与 $_SESSION 变量相同吗?怎么样?
  • @Zackattack 您可以使用“频道”。最简单的方法是浏览 Pusher 的 API 文档,看看他们的频道是如何工作的。你可以在你的 WS 服务器中实现类似的东西。 (这很简单,您可以通过令牌或会话进行身份验证)。然后,您可以从前端订阅频道。然而,我们不再使用 Node.js:我们用 PHP 编写了我们的 WS 服务器,这要归功于很棒的 Ratchet package
  • 谢谢你的回复,我本来打算用ratchet的,但是好像比node js复杂。我花了几个小时试图实现它并没有走得太远。我能够让 node js 在 30m 以下工作,之前没有使用 node js 的经验

标签: php apache node.js


【解决方案1】:

在这种情况下,我要做的是使用Socket.IO 设置 Node.js 服务器。这为您提供了一种向客户端发送近乎实时的数据的跨浏览器方法。

当客户端加载您的 PHP 页面时,您将有一个 <script> 标记指向您的 Node.js 服务器以加载 Socket.IO。加载后,Socket.IO JavaScript 客户端将连接到您的 Node.js Socket.IO 服务器并等待发出事件。

现在,由于您希望从 PHP 发送这些事件,因此您需要在 PHP 应用程序和 Node.js 之间建立一个通信通道。我为此推荐using Redis pub/sub。基本上,您的 PHP 应用程序会发布一条消息,而您的已订阅该消息的 Node.js 服务器将接收该消息。然后,这些服务器可以立即将消息传递给客户端,以从 PHP 获取更多数据。 (我想您会发现,让您的 Node.js 服务器一开始就发送该数据可能同样容易。)

如果需要,您可以将 Node.js 放在 Nginx 服务器后面,but you need the latest and greatest version for true web socket support

【讨论】:

  • 这听起来很完美,尤其是因为我已经在使用 Redis 来构建活动流。关于使用脚本标签的部分就像一个灯泡熄灭了。正是我所追求的。非常感谢。
  • 使用 Redis 作为 PHP 和 Node.js 之间的通信通道,您如何看待使用 Curl 从 PHP 向 Node.js 应用程序发送请求?接下来,在 Node.js 应用程序中的请求事件中,我们将向连接的套接字发出数据/通知。
  • @user346665 这当然是一种选择,但是您实际上是在使用 pub/sub 重新发明轮子,然后您必须管理启动/关闭的服务器列表,并处理您的 PHP 脚本将挂起的事实(除非您使用 multicurl,这对于这样的事情来说真的很麻烦)。
  • 但是如果我们只使用一个节点服务器,这样可以解决吗?
  • @SOuřaanGřg 虽然我会付费咨询项目,但目前我的日程安排中没有任何空闲时间。此外,Stack Overflow 并不是聘请顾问的合适场所。我建议在专门聘请知识渊博的顾问的网站上寻找顾问。
【解决方案2】:

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

Ratchet - PHP WebSockets

唯一的要求是 PHP 的 zmq 绑定,它被用作将数据从 PHP 脚本传递到 websocket 服务器的方法。如果你的 PHP 实例不是用它构建的,那么你可以找到它here

Github repo 是 here,有很多例子可以让你继续前进是 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2017-12-14
    • 2016-06-12
    • 2017-05-10
    • 2018-02-15
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多