node.js - laravel5.2 broadcaster无法广播,且不报错?
问题描述
环境:Mac ,laravel版本 5.2.x ,valet
问题描述:
在用laravel配合nodeJS的socket.io做websocket时出现的错误。
这是socket的服务端代码
var http = require(’http’).Server();var io = require(’socket.io’)(http);var Redis = require(’ioredis’);var redis = new Redis();redis.subscribe(’test-channel’);redis.on(’message’, function (channel, message) { console.log(message); message = JSON.parse(message); io.emit(channel + ’:’ + message.event, message.data);});http.listen(3001, function () { console.log(’Server is running at 3001!’);});
这是route代码
Route::get(’/test’, function () { $data = [’event’ => ’inbox’,’data’ => [ ’name’ => ’WTF’] ]; Redis::publish(’test-channel’, json_encode($data)); return ’Done’;});
然后访问/test页面后,命令行显示如图:
前端也收到了数据,就不展示了,问题的关键在于
当我将route的代码改成如下:
Route::get(’/test’, function () { event(new AppEventsTest(’ARE U OK ?’)); return ’Done’;});
然后通过
php artisan make:event Test
生成的event事件代码如下:
<?phpnamespace AppEvents;use AppEventsEvent;use IlluminateQueueSerializesModels;use IlluminateContractsBroadcastingShouldBroadcast;class Test extends Event implements ShouldBroadcast{ use SerializesModels; public $name; public function __construct($name) {$this->name = $name; } public function broadcastOn() {return [’test-channel’]; }}
然后访问/test页面,命令行无输出。
在这之前,是配置过broadcast的driver的
.env文件里
BROADCAST_DRIVER=redis
config的cache也已经clear过了
从使用Redis::publish成功可以看出,laravel和Redis链接是成功的,那么问题应该出在哪里呢?
还请大神指教!
问题解答
回答1:经过重开项目,复制同样代码,执行正常后发现,是原有项目的QUEUE_DRIVER=redis造成的问题,应该是队列的问题。
将QUEUE_DRIVER=redis改成sync即可。
回答2:谢邀。 大概看了下代码,好像没啥问题。不过有一个地方你没说明,是不是队列执行那里出了问题。broadcasting event 会把 event 放到一个队列里执行,是不是你没有启动队列监听。
先尝试把你event里的 use IlluminateContractsBroadcastingShouldBroadcast; 给后面几个 Now:变成 use IlluminateContractsBroadcastingShouldBroadcastNow; 然后测试看能否广播。
如果可以的话,把 Now 去掉改回去,然后在命令行执行 php artisan queue:listen 后再发广播