laravel Redis 广播
github 地址
https://github.com/bool-true/laravel-echo-redis
先简单剖析一下:
laravel 的广播系统和队列系统类似,需要两个进程协作,一个是 laravel 的 web 后台系统,另一个是 Socket.IO 服务器系统。具体的流程是页面加载时,网页 js 程序 Laravel Echo 与 Socket.IO 服务器建立连接, laravel 发起通过驱动发布广播,Socket.IO 服务器接受广播内容,对连接的客户端网页推送信息,以达到网页实时更新的目的。
上代码
一、 配置
-
驱动配置
具体配置文件 config/broadcasting.php,这里我们主要是用redis作为广播驱动(类似于队列驱动),我直接在env中配置BROADCAST_DRIVER=redis
-
Redis 安装
此处用的redis驱动 所以未安装的 cmd执行composer require predis/predis
,安装过的略过 -
广播服务提供者
就是将config/app.php 配置文件中 providers数组中App\Providers\BroadcastServiceProvider::class
,注释打开 -
Laravel-echo 安装
Laravel Echo是一个JavaScript库,web端可以轻松订阅频道并收听Laravel广播的事件,
需要node 的npm包管理器安装 没有的自行度娘安装node
首先cmd 执行npm install
安装package.json里的依赖 (必须),抽根烟等会儿
接着执行npm install laravel-echo-server
安装 laravel-echo服务端
最后执行npm install laravel-echo
安装 laravel-echo前端资源(可省略一般第二部都已经安装了,但是安装更新一下最好)初始化 laravel-echo-server
laravel-echo-server init // 是否在开发模式下运行此服务器(y/n) 输入y ? Do you want to run this server in development mode? (y/N) // 设置服务器的端口 默认 6001 输入 6001就可以了 或者你想要的 ? Which port would you like to serve from? (6001) // 想用的数据库 选择 redis ? Which database would you like to use to store presence channel members? (Use arrow keys) ❯ redis sqlite // 这里输入 你的laravel 项目的访问域名 ? Enter the host of your Laravel authentication server. (http://localhost) // 选择 网络协议 http ? Will you be serving on http or https? (Use arrow keys) ❯ http https // 您想为HTTP API生成客户端ID/密钥吗 N ? Do you want to generate a client ID/Key for HTTP API? (y/N) // 要设置对API的跨域访问吗?(y/n)N Configuration file saved. Run laravel-echo-server start to run server.
这一系列配置完成后 项目根目录下 会生成 laravel-echo-server.json 文件 这里面就是刚才的配置
执行
laravel-echo-server start
启动服务 出现如下 则启动成功C:\wamp64\www\laravel7>laravel-echo-server start L A R A V E L E C H O S E R V E R version 1.4.2 ⚠ Starting server in DEV mode... ✔ Running at localhost on port 6001 ✔ Channels are ready. ✔ Listening for http events... ✔ Listening for redis events... Server ready!
二、创建频道
- 频道的种类:
Channel 表示任何用户都可以订阅的公开频道
PrivateChannel 表示需要 频道授权 的私有频道
1.先说公共频道(channel)
- 创建事件
cmd运行php artisan make:event PublicMessageEvent
<?php
namespace App\Events;
...
class PublicMessageEvent extends Event implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
//消息内容
public $message;
public function __construct(string $message)
{
$this->message = $message;
}
//返回一个公共频道 频道名称为push
public function broadcastOn()
{
return new Channel('push');
}
//laravel 默认会使用事件的类名(PublicMessageEvent )作为广播名称来广播事件,
//这里可以使用 broadcastAs 方法自定义广播名称
public