node.js - laravel5.2 broadcaster无法广播,且不报错?
天蓬老师
天蓬老师 2017-04-17 14:48:22
0
2
700

环境: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 \App\Events\Test('ARE U OK ?'));

    return 'Done';
});

然后通过

php artisan make:event Test

生成的event事件代码如下:

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

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链接是成功的,那么问题应该出在哪里呢?

还请大神指教!

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(2)
大家讲道理

プロジェクトを再度開き、同じコードをコピーして通常どおり実行した後、問題の原因は元のプロジェクトの QUEUE_DRIVER=redis であることがわかり、キューの問題であるはずです。

QUEUE_DRIVER=redis を同期するように変更します。

いいねを押す +0
阿神

ご招待いただきありがとうございます。 ざっとコードを見たところ、特に問題はなさそうです。しかし、説明されていないことが 1 つあります。それは、キューの実行に問題があるかどうかです。
イベントをブロードキャストすると、イベントが実行のためにキューに入れられます。キュー監視を開始していませんか?

まず、イベント内の use Illuminate\Contracts\Broadcasting\ShouldBroadcast; を次の Now に変更してみます。 use Illuminate\Contracts\ に変更します。ブロードキャスト \ShouldBroadcastNow; 次に、ブロードキャストできるかどうかをテストします。

可能であれば、Now を削除して元に戻し、ブロードキャストする前にコマンドラインで phpArtisan queue:listen を実行してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート