带有 Redis 的 Laravel 广播无法工作/连接?

Posted

技术标签:

【中文标题】带有 Redis 的 Laravel 广播无法工作/连接?【英文标题】:Laravel Broadcast with Redis not working/connecting? 【发布时间】:2015-09-24 15:30:35 【问题描述】:

所以我尝试在 Redis 的帮助下广播 Laravel 5 事件。不,我不想使用像 Pusher 这样的服务,因为它不是免费的(即使免费限制对我来说已经足够了)而且我想控制广播服务器。

所以到目前为止我所做的是,我已经设置了一个 redis 服务器(侦听端口 6379 -> 默认),我已经设置了以下事件:

class MyEventNameHere extends Event implements ShouldBroadcast

    use SerializesModels;
    public $data;

    /**
     * Create a new event instance.
     *
     * @return \App\Events\MyEventNameHere
     */
    public function __construct()
    
        $this->data = [
            'power' => 10
        ];
    

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    
        return ['pmessage'];
    

我注册了一条通往该事件的路线:

Route::get('test',function()

    event(new App\Events\MyEventNameHere());
    return "event fired";
);

我已经创建(更像是复制:P)节点套接字服务器:

var app = require('http').createServer(handler);
var io = require('socket.io')(app, origins:'*:*');

var Redis = require('ioredis');
var redis = new Redis();

app.listen(6379, function() 
    console.log('Server is running!');
);

function handler(req, res) 
    res.writeHead(200);
    res.end('');


io.on('connection', function(socket) 
    console.log(socket);
);

redis.psubscribe('*', function(err, count) 
);

redis.on('pmessage', function(subscribed, channel, message) 
    console.log(message);
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
);

我创建了实际接收广播的视图(testview.blade.php):

@extends('layout')
@section('content')
<p id="power">0</p>

<script>
var socket = io('http://localhost:6379');
socket.on("pmessage:App\\Events\\MyEventNameHere", function(message) 
    console.log(message);
    $('#power').text(message.data);
);
console.log(socket.connected);
</script>
@endsection

我可以毫无问题地启动 redis 服务器。 我可以启动节点 socket.js 服务器,我得到响应“服务器正在运行”

当我点击事件的路由时,我的浏览器中会返回“事件触发”。

当我到达实际视图的路线时

Route::get('test/view',function()

    return view('testview');
);

我可以看到整个页面(布局被渲染),webconsole 没有显示任何错误。

但是如果我触发事件,视图不会改变,这意味着广播没有接收到吗?

现在我为控制台添加了一个输出

console.log(socket.connected);

如果client 连接到socket.io,这应该告诉我,对吗?

嗯,输出显示false。我在这里做错了什么?

关于我的设置的更多信息:我在 php 内置服务器上运行整个项目,整个项目都在 Windows 上运行(如果有的话),我的防火墙没有阻止任何端口。

编辑 1:

我忘了说我的节点服务器也没有收到消息......它只说“服务器正在运行”,没有别的。

编辑 2:

我使用了另一个 socket.js:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();

app.get('/', function(req, res) 
    res.sendFile(__dirname + '/index.html');
);

redis.subscribe('test-channel', function () 
    console.log('Redis: test-channel subscribed');
);

redis.on('message', function(channel, message) 
    console.log('Redis: Message on ' + channel + ' received!');
    console.log(message);
    message = JSON.parse(message);
    io.emit(channel, message.payload)
);

io.on('connection', function(socket) 
    console.log('a user connected');
    socket.on('disconnect', function() 
        console.log('user disconnected');
    );
);

http.listen(3000, function() 
    console.log('listening on *:3000');
);

这一次控制台接收到消息。 因此,如果节点 socket.io 接收到消息,那么我的客户端出了什么问题?显然消息正在正确广播,唯一的问题是客户端没有收到它们......

【问题讨论】:

您的 redis 服务器和您的节点/socketio 应用程序 试图在 :6379 上进行侦听,而您的前端试图与 redis 端口建立 websocket 连接。 我已经尝试更改端口,redis on :6379 和 socketio on :3000,出现同样的问题。 您似乎回答了自己的问题。为什么不将“编辑 2”socket.js 中的代码粘贴到刀片模板中并完成它? 【参考方案1】:

在触发事件之前,您是否尝试过从命令行监听 laravel 队列?

php artisan queue:listen

【讨论】:

【参考方案2】:

您的代码的问题是您将客户端套接字连接到 redis 默认端口 6379,而不是节点端口 3000。

所以在你的刀片视图中更改 var socket = io('http://localhost:6379'); to var socket = io('http://localhost:3000');

【讨论】:

【参考方案3】:

我不能说到底出了什么问题,可能没有人不能说,因为你的问题是广泛的和环境相关的。使用Wireshark Sniffer,您可以轻松确定部分解决方案无法正常工作,然后尝试围绕实际问题找到解决方案。

如果您的问题是关于如何做到这一点,我建议不要在服务器端涉及节点并使用 .NET 或 Java 语言。

【讨论】:

以上是关于带有 Redis 的 Laravel 广播无法工作/连接?的主要内容,如果未能解决你的问题,请参考以下文章

广播 laravel 事件和多个频道

Laravel Lumen + Broadcasting + Redis + Class pusher not found

无法使用 Laravel echo server、redis 和 socket.io 验证 laravel 私人频道

laravel5.5事件广播系统实例laravel-echo + redis + socket.io

Laravel:Redis 无法建立连接:[tcp://127.0.0.1:6379]

无法广播客户端事件(连接未订阅频道私聊)