Laravel与Redis的广播不工作/连接?

所以我试图在Redis的帮助下播放Laravel 5 Events。 不,我不想使用像Pusher这样的服务,因为它不是免费的(即使免费的限制对我来说是足够的),我想保持对广播服务器的控制。

所以我到目前为止所做的是,我build立了一个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"; }); 

我创build了(更像复制: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); }); 

我创build了实际接收广播的视图(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 。 我在这里做错了什么?

有关我的设置的更多信息:我正在运行整个项目在内置的服务器上,整个事情在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收到消息,那么我的客户端有什么问题? 显然这些消息正在被正确地广播,唯一的是他们没有被客户接收到…

我不能说什么是错的,也许没有人不能,因为你的问题是广泛和环境的依赖。 使用Wireshark嗅探器,您可以轻松地确定不正常工作的解决scheme的一部分,然后尝试find解决实际问题的解决scheme。

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

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

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

你有没有尝试从命令行听到laravel队列,然后才能触发事件?

php artisan queue:listen