【问题标题】:PHP Websocket to Node/SockjsPHP Websocket 到 Node/Sockjs
【发布时间】:2026-01-28 04:05:02
【问题描述】:

我有一个带有 SockJS 的 NodeJS 服务器。客户端连接到节点服务器,通过浏览器创建 websocket。问题是试图创建一个从 php 到 node 的 websocket。

我正在使用https://github.com/lemmingzshadow/php-websocket/blob/master/client/lib/class.websocket_client.php 的文件作为在 php 中创建 websocket 的一种方式。

服务器在端口 9999 上运行,并在浏览器中使用 wss://nodejs.example.com:9999/sockjs/websocket 建立连接。服务器记录通过 console.log 建立的连接

因此我将nodejs.example.com, 9999, sockjs/websocket 分别传入host, port 和path 字段。

但是,节点服务器永远不会看到发出的获取连接。

(这背后的想法是服务器安装了繁重的 php 后端,通过让它告诉节点何时向客户端发送数据,我们可以进行更实时的交互并删除轮询,而无需进行全面的切换)。

TLDR:我希望能够从 PHP 向 NodeJS/SockJS 服务器发送消息

【问题讨论】:

    标签: php node.js


    【解决方案1】:

    我能够为自己创建一个解决方案,它可能不适用于所有场景,但至少在这里有效。通过让节点服务器在另一个运行纯 websockets 的端口上托管额外的服务器,我能够使用该端口/服务器,而无需修改我正在使用的 websocket 客户端类。

    【讨论】:

      【解决方案2】:

      我偶然发现了这个问题,我想做出贡献。我有完全相同的问题。我通过使用 Redis 和 Redis 中使用的发布/订阅模式解决了这个问题。

      除了您的 PHP 和 node.js 服务器之外,您还安装了 Redis。用于 PHP 的 Predis 库 (https://github.com/nrk/predis) 和用于 node.js 的 redis-node (https://github.com/NodeRedis/node_redis)。

      示例代码:

      PHP

      $redis = new Client();
      $redis->publish('updates', Random::getUniqueString());
      

      node.js 服务器上的 Redis 客户端

      require('redis').createClient()
      
      redis.subscribe('updates');
      
      redis.on('message', function(channel, data) {
          for (var id in sockets) {
              if (sockets.hasOwnProperty(id)) {
                  sockets[id].write(data);
              }
          }
      });
      

      sockets 是来自 SockJS 的套接字连接。

      【讨论】: