gpt4 book ai didi

php - 带 REDIS 的套接字 IO。服务器收不到 channel 消息

转载 作者:可可西里 更新时间:2023-11-01 10:53:42 26 4
gpt4 key购买 nike

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

我在连接到 Redis 的 Node.JS 上有一个最小的 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 服务器因为未知原因没有得到事件。

我在考虑不同的 channel socket.io#emittersocket.io#/#socket.io-sync#request#/# 两者都使用。但是在我阅读的所有文章中,他们都没有使用或更改它们。

所以可能是包版本不匹配?但是下面这个版本都是我同事用的。。。(这个问题我问他们了,还在找)

在 PHP 上,我将 composer 与:

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

在 Socket IO 服务器上,npm 有:

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

如果有人有想法,我将不胜感激;)

编辑:我的同事使用 Vagrant,我尝试看看是否有什么不同,是的,socket.io 服务器订阅的 channel 有所不同。它是 psubscribe""socket.io#* 而不是 socket.io#/# 但他们没有触及任何相关内容并且两者的来源相同(docker和流浪者)有点疯狂吧?..

最佳答案

好吧,把问题和解决方案分开。这里的问题就出在我对socket IO和Redis的理解和经验不足上。

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

我希望它能对 Socket IO 和 Redis 的新学徒有所帮助 :)

关于php - 带 REDIS 的套接字 IO。服务器收不到 channel 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com