带REDIS的套接字IO。服务器无法收到频道消息

时间:2018-03-10 21:40:02

标签: php node.js docker redis socket.io

我失去了近2天的谷歌搜索和搜索试图找出我的设置有什么问题。 我的所有服务都在Docker容器中运行,所有服务都已正确连接(我已经测试过了)

我在Node.JS上连接到Redis的最小Socket IO服务器:

require('longjohn');
require('dotenv').load({silent: true});
process.env = process.env || {};

var PORT    = process.env.SOCKET_PORT || 4567;
var io      = require('socket.io').listen(PORT);
var redis   = require('socket.io-redis');

io.adapter(redis({
    host: process.env.REDIS_HOST || 'redis',
    port: process.env.REDIS_PORT || 6379
}));

io.on('connection', function (socket) {
    console.log(`New connection!`);
}

当我在Redis上监控这段代码时,我得到了:

1520713149.833184 [0 172.20.0.8:40858] "info"
1520713149.833631 [0 172.20.0.8:40860] "info"
1520713149.834154 [0 172.20.0.8:40862] "info"
1520713149.839510 [0 172.20.0.8:40860] "subscribe" "socket.io#/#"
1520713149.840678 [0 172.20.0.8:40862] "subscribe" "socket.io-sync#request#/#"

然后连接并发送给Redis的php应用程序

<?php

require(__DIR__.'/vendor/autoload.php');

$client = new Predis\Client([
    'scheme' => 'tcp',
    'host'   => 'redis',
    'port'   => 6379,
]);

$client->connect();
$emitter = new SocketIO\Emitter($client);
$emitter->emit('event', 'payload str');

在Redis上:

"PUBLISH" "socket.io#emitter" "\x92\x83\xa4type\x02\xa4data\x92\xa5event\xabpayload str\xa3nsp\xa1/\x82\xa5rooms\x90\xa5flags\x90"

所以看起来所有人都来到了REDIS,但socket io服务器并没有因为未知原因而获得该事件。

我在考虑两者使用的不同渠道socket.io#emittersocket.io#/#socket.io-sync#request#/#。但是我读过的所有文章都没有使用或改变它们。

所以也许这是一个不匹配的软件包版本?但是下面所有这个版本都被我的同事使用了......(我问他们这个问题,还在寻找)

在PHP上,我使用composer:

{
    "require": {
        "rase/socket.io-emitter": "^0.7.0",
        "predis/predis": "^1.0"
    }
}

在Socket IO Server上,npm with:

{
  "dependencies": {
    "dotenv": "~1.2.0",
    "longjohn": "~0.2.9",
    "socket.io": "~1.3.7",
    "socket.io-redis": "^1.1",
  }
}

如果有人有想法,我会非常感激;)

编辑: 我的同事使用Vagrant,我试着看看是否有什么不同,是的,socket.io服务器订阅的频道有所不同。 它是psubscribe" "socket.io#*而不是socket.io#/#,但他们没有触及任何关于它的内容,而且两者(码头工人和流浪者)的来源是一样的疯狂对吗?

1 个答案:

答案 0 :(得分:0)

好的,将问题和解决方案分开。这里的问题是我对socket IO和Redis的误解和缺乏经验。

当客户通过Redis发送时,我应该有一个新的连接。 实际上,并非如此,新连接只会来自连接到IO套接字的客户端。 我使用DEBUG = *来查看服务器上发生的一切,确实是,套接字IO从REDIS获取信息。我是错误的,缺乏经验只关注频道名称。

我希望它能帮助Socket IO和Redis上的新padawan:)