node.js - 使用 Redis 和 Socket.io 在 Laravel 5.2 中进行事件广播

标签 node.js websocket redis socket.io laravel-5.2

我将 Laravel 5.1 更新到 5.2,事件不再广播。

我正在将 Laravel homestead 与 php 7 和 hhvm、Node 5.3.0、Redis 3.0.6 一起使用。

Redis 运行良好。 (我试过 Redis::publish)。

我触发了事件,但没有收到任何消息。

事件类

namespace App\Events;

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

class UserSignedUp extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $username;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($username)
    {print_r($username);
        $this->username = $username;
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ['test-channel'];
    }
}

路线

Route::get('event', function () {
    $data = [
        'event' => 'UserSignedUp',
        'data' => [
            'username' => 'JohnDoe'
        ]
    ];

// Works fine
    Redis::publish('test-channel', json_encode($data));

// It does not broadcast anything
    event(new \App\Events\UserSignedUp('JohnDoe'));
});

Socket.io 服务器

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

redis.subscribe('test-channel', function (err, count) {
});

redis.on('message', function (channel, message) {
    console.log('Message Recieved: ' + message);

    message = JSON.parse(message);

    io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function () {
    console.log('Listening on Port 3000');
});

环境配置

CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis
BROADCAST_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

最佳答案

每个被触发的事件都被推送到 redis 队列中,要广播你必须释放队列中的作业,你可以使用

php artisan queue:listen ....

php artisan 队列:工作

命令

关于node.js - 使用 Redis 和 Socket.io 在 Laravel 5.2 中进行事件广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36609110/

相关文章:

ajax - 如何 : Get real-time notifications in Laravel 4 using Iron. io MQ、推送队列和 AJAX

java - Jetty Websocket,关闭 session OpCode 12

caching - 我的公司使用 memcache 作为对象就好了,看不到缓存中需要 redis

node.js - Redis + node.js 渲染对象列表

php - 将数据添加到数据库时立即将数据推送到前端 (Ushahidi)

node.js - 多 Node js 服务器与 socket.io-redis 相互通信不接收事件

node.js - 如何将 Node.js Express 应用程序部署在 HAProxy 后面?

php - Apache Benchmark - 并发和请求数

javascript - 使用 Graphql 时在 Mongoose 模式中填充 "Ref"

javascript - nodemailer 不返回错误但未发送电子邮件