Redis的Laravel广播没有工作/连接?

时间:2015-07-07 08:32:49

标签: javascript node.js sockets laravel redis

所以我试图在Redis的帮助下播放Laravel 5 Events。不,我不想使用像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服务器,我得到响应&#34;服务器正在运行&#34;

当我点击参加活动的路线时,我得到了返回&#34;事件被解雇&#34;在我的浏览器中。

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

Route::get('test/view',function()
{
    return view('testview');
});

我可以看到整个页面(呈现布局),并且webconsole不会显示任何错误。

但是,如果我发起了这个事件,视图就不会改变,这意味着广播没有被收到吗?

现在我包含了控制台的输出

console.log(socket.connected);

如果clientsocket.io权限相关联,应该告诉我

嗯,输出结果为false。我在这里做错了什么?

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

编辑1:

我忘了说我的节点服务器也没有接收到这些消息......它只是说&#34;服务器正在运行&#34;,没有别的。

编辑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收到消息,那么我的客户端有什么问题?显然这些消息正在被正确播放,唯一的问题是它们没有被客户接收......

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

因此,在您的刀片视图中更改var socket = io(&#39; http://localhost:6379&#39;); to var socket = io(&#39; http://localhost:3000&#39;);

答案 2 :(得分:1)

您是否曾尝试在命令行之前侦听laravel队列,然后再触发事件?

php artisan queue:listen