Laravel 广播系统的踩坑

Laravel有一个一般很少用的“广播系统”,说白了,就是利用 Websocket 进行实时通信的一个技术。众所周知,Websocket 必须常驻后台才能正常使用,而 PHP 的特点就是执行完就结束,那么 Laravel 又是怎么实现广播的呢?一个方案是:使用外部手段如 Node.js 来作为 socket.io 服务器代替 Laravel 进行 Websocket 通信;另一个方案是:Websocket 仍由 PHP 实现,但通过命令行运行来常驻。本质上这两个方案是一样的,不过有一个社区驱动的 laravel-echo-server 程序可以直接使用,它基于 Node.js,完美兼容laravel的广播系统。虽然组件比较多,但是配置起来也不算太难,实际上线时只要重新配置 laravel-echo-server 即可使用。

关于广播系统的详细信息,请看:https://learnku.com/docs/laravel/6.x/broadcasting/5159

安装配置教程网上都有,随便找一个就好了,这里重点讲一下有哪些坑

频道名称

首先要说一说前端部分。前端采用的是 Laravel Echo,因此我们在需要监听的页面使用如下代码:

Echo.channel(`test`)
    .listen('ShippingStatusUpdated', (e) => {
        console.log(e);
    });

然而,上面的代码一般用于公共的频道,通常我们还会使用私有频道,那么就要改为:

Echo.private(`order.${orderId}`)
    .listen('ShippingStatusUpdated', (e) => {
        console.log(e.update);
    });

具体的细节就是,channel变成了private,代码的解释请看官方文档

 

laravel-echo-server.json

假如说,你做好所有的配置,然后去测试时,发现实际使用的频道并不是你所定义的名称,而是在你的名称前加了一串字符串,恭喜你发现了新大陆。其实这是 laravel 的数据库配置搞的鬼。打开 config/database.php,看到 redis 下的 options,是不是有一个prefix?那个就是那一串字符串的由来。不过好办,我们先在 .env 文件配置一下 REDIS_PREFIX,这个可以随意设置,但是等会要用的。然后,打开 laravel-echo-server.json,把 redis 字段设置为:

    "redis": {
            "port": "6379",
            "host": "127.0.0.1",
            "password": "",
            "keyPrefix": "xxxx-"
        },

其中 xxxx- 就是 REDIS_PREFIX 的内容了。配置完以后,重启所有相关的服务,再试一次,你就会发现它OK了。

以上教程参考自:解决Laravel-echo-server广播事件的Redis前缀问题 – Tabll

 

其他暂未发现有什么坑,有的话会持续更新。

发表评论