laravel5.5事件广播系统实例laravel-echo + redis + socket.io
本教程会详细介绍配置的方法,以给全体用户发送通知为例。
1. 广播配置说明
1.1 广播驱动配置
文件位置 config/broadcasting.php
<?php
return [
'default' => env('BROADCAST_DRIVER', 'null'),
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
//
],
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
'log' => [
'driver' => 'log',
],
'null' => [
'driver' => 'null',
],
],
];
可以看到Laravel自带了4个广播驱动器 pusher, redis, log, null
1.2 注册服务提供器
服务提供器位置:App\Providers\BroadcastServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;
class BroadcastServiceProvider extends ServiceProvider
{
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}
你只需在 config/app.php 配置文件的 providers 数组中取消对该提供者的注释即可
2. 驱动器配置
这里采用 redis + soocket.io 的组合
2.1 安装predis
如果你使用 Redis 广播器,请安装 Predis 库:
composer require predis/predis "~1.0"
2.2. 配置服务端
这里采用社区驱动维护的项目 tlaverdure/laravel-echo-server,这是一个使用socket.io来支持laravel广播的nodejs服务器。当运行后会将socket.io客户端js代码暴露在一个标准的的url中。我们需要在我们的项目中(视图文件)引入这个地址。
2.2.1 安装方法
npm install -g laravel-echo-server # 这里是全局安装
2.2.2 初始化服务端
我是这样选择初始化配置的。可以根据自己情况改变
$ laravel-echo-server init
? Do you want to run this server in development mode? Yes
? Which port would you like to serve from? 6001
? Which database would you like to use to store presence channel members? redis
? Enter the host of your Laravel authentication server. archerwong.cn
? Will you be serving on http or https? http
? Do you want to generate a client ID/Key for HTTP API? Yes
? Do you want to setup cross domain access to the API? No
appId: c953434932b06864
key: 551440289d2d41c81e87d55c1d0217e5
Configuration file saved. Run laravel-echo-server start to run server.
2.2.3 运行服务端
$ laravel-echo-server start
L A R A V E L E C H O S E R V E R
version 1.3.6
⚠ Starting server in DEV mode...
✔ Running at localhost on port 6001
✔ Channels are ready.
✔ Listening for http events...
✔ Listening for redis events...
Server ready!
检测下socket.io客户端url地址是否可访问
http://your_host_address:6001/socket.io/socket.io.js
可访问,并内容类似于以下则说明服务器可用
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(......
2.3 配置客户端
2.3.1 安装laravel-echo
Laravel Echo 是一个 JavaScript 库,它使得订阅频道和监听由 Laravel 广播的事件变得非常容易。
npm install laravel-echo --save # 安装laravel-echo 并记录package.json
2.3.2 创建一个全新的 Echo 实例
官方说法是在resources/assets/js/bootstrap.js文件底部引入是个好地方,打开该文件加入下面内容
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
其实如果使用blade模板,没有使用vue等前端,我们需要在入口视图定义id="app"挂载点,否则打包后会发现#app未定义,并且会打包进去vue等我们不需要的内容,文件也会变大,
简单粗暴一点可以修改resource/assets/js/app.js,直接打包我们需要的内容
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
2.3.3 使用laravel-mix打包
修改 webpack.mix.js
let mix = require('laravel-mix');
mix.js('resources/assets/js/app.js', 'public/js');
// .sass('resources/assets/sass/app.scss', 'public/css');
生成
npm run dev
这样我们就得到了一个压缩的public/app.js文件
2.3.4 在视图引入各项
- 引入csrf
Laravel Echo 会需要访问当前会话的 CSRF 令牌,可以在应用程序的 head HTML 元素中定义一个 meta 标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
- 引入Socket.IO JavaScript 客户端库
<script src="//{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script>
- 实例化Echo
<script src="/js/app.js"></script>
<script>
<!--上面app.js已经进行了Echo的实例化,然后应该使用实例化的Echo进行广播事件的监听-->
console.log(Echo);
</script>
到此为止,我们基本的配置已经完成,Echo的前端监听等后面讲到再补充。
3. 后端事件
3.1 前提是配置和运行队列侦听器
修改.env 中的配置
QUEUE_DRIVER=redis
运行队列监听
php artisan queue:work
3.2 编写事件
创建文件 app/Events/TestBroadcastingEvent.php, 内容如下
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\Http\Model\Notice;
class TestBroadcastingEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $notice;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Notice $notice)
{
$this->notice = $notice;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new Channel('notice');
}
}
3.3 分发事件
<?php
namespace App\Http\Controllers\Home;
use App\Http\Model\Notice;
use App\Events\TestBroadcastingEvent;
class TestController extends CommonController
{
public function send($id)
{
//当需要给全体发通知的时候触发
$notice = Notice::find($id);
event(new TestBroadcastingEvent($notice));
}
}
4. 前端监听
应该还记得前面已经实例化了Echo,现在就是要用这个Echo进行监听,实现广播功能
<script src="//{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script>
<script src="/js/app.js"></script>
<script>
<!--上面app.js已经进行了Echo的实例化,然后应该使用实例化的Echo进行广播事件的监听-->
console.log(Echo);
Echo.channel('notice')
.listen('TestBroadcastingEvent', (e) => {
// 如果有广播过来你可以进行逻辑操作,比如给用户一个通知
console.log(e);
console.log(e.order);
});
5. 查看结果
触发send()方法进行测试,控制台输出如下内容
{notice: {…}, socket: null}
{id: 1, content: "感谢你的仔细阅读,期待共同进步!", created_at: null, updated_at: null}
发现我们后端TestBroadcastingEvent事件类的notice属性被传递过来了,你就可以收到我的感谢了。
6. 整体结构
后端: laravel-echo-server服务器 (通过url地址暴露 socket.io.js)=> 编写并触发广播事件
前端: laravel-echo库 + 后端暴露的socket.io.js => 实例化Echo => 监听广播事件
laravel5.5事件广播系统实例laravel-echo + redis + socket.io的更多相关文章
- laravel5.5事件广播系统
目录 1. 定义广播事件 1.1 广播名称 1.2 广播数据 1.3 广播队列 1.4 广播条件 2. 频道授权 2.1 定义授权路由 2.2 定义授权回调 3. 对事件进行广播 3.1 可以使用ev ...
- laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到
laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...
- laravel 使用Redis
1.非框架中使用redis实例? 就是new出redis对象然后连接,然后键值操作即可 <?php $redis = new redis(); $redis->connect('127.0 ...
- laravel 操作 redis
laravel框架中本身已经存在相应的redis的配置我们在使用的时候只需要更改配置即可,但是在使用的时候一定要注意命名空间的问题,具体可查看config/app.php下面的aliases数组中具体 ...
- Laravel安装redis扩展
Laravel安装redis扩展 1.使用命令行,执行(当然要先安装composer) composer require predis/predis 2.执行完就安装好了,redis相关配置可以到.e ...
- Laravel使用redis保存SESSION
Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...
- PHP实现事件机制实例分析
PHP实现事件机制实例分析 内置了事件机制的语言不多,php也没有提供这种功能.事件(Event)说简单了就是一个Observer模式.实现起来非常easy.可是有所不同的是,事件的监听者谁都能够加, ...
- [PHP] Laravel5.5 使用 laravel-cors 实现 Laravel 的跨域配置
Laravel5.5 使用 laravel-cors 实现 Laravel 的跨域配置 最开始的时候,我使用的是路由中间件的方式,但是发现中间件不起作用 这是之前使用的方式: 'cros' => ...
- [PHP] Laravel使用redis保存SESSION
Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...
随机推荐
- 简单粗暴的更换固态硬盘及WIN10 Ubuntu双系统
简介:本文希望帮助如本人一样的计算机小白,能够以最快的速度更换固态硬盘及安装系统. 1.提前将准备空白U盘(至少8G),利用UltraISO工具,或者软媒魔方,制作U盘启动盘. PS:需提前下载好WI ...
- Open XML的上传、下载 、删除 ......文件路径
/// <summary> /// Get download site, if download tempfolder not existed, create it first /// & ...
- MySQL 相关文章参考
MySQL 中隔离级别 RC 与 RR 的区别http://www.cnblogs.com/digdeep/p/4968453.html MySQL+InnoDB semi-consitent rea ...
- 使用selenium grid与BrowserMobProxyServer联合使用
背景:项目主要是做埋点数据,要使用 BrowserMobProxyServer,它相当于做一个代理,在你访问一个网页时,通过代理,获取打开网页的数据,对比你需要对比数据,所以这个工具提供获取页面请求的 ...
- Google搜索引擎使用小技巧
相信大家都知道,利用Google等搜索引擎进行信息查证是翻译过程中十分重要的一环.事实上,掌握信息搜索的技巧和方法,不仅对翻译工作大有帮助, 在网络信息时代,学会充分利用搜索引擎,在很多情况下都可以达 ...
- Ubuntu 18.04 一键安装深度截图工具 Deepin Screenshot
一直在寻找Linux下的截图软件,终于发现了Deepin ScreenShot,其功能齐全,界面美观,唯一的缺点需要自己配置快捷键(后面会讲). 安装 直接在Ubuntu商店搜索“深度截图”,点击“安 ...
- python中的for循环如何控制步长
for i in range(开始/左边界, 结束/右边界, 步长): print i 例如 for i in range(1, 10, 2): print i 等价于 for (i=1;i<= ...
- CentOS 系统 Docker 的命令大全
本文记录 CentOS 系统 Docker 的命令大全 命令 docker ps 显示运行中的容器 docker ps -a 显示所有容器 docker start 容器名称 启动容器 docker ...
- kickstart+pxe+tftp+ntp(http)自动化安装平台的搭建
听说过"克隆"吗,对于这个科技术语20年前可能还很陌生,羊可以克隆,通过基因dna序列:机器同样可以克隆通过网络IP! 如下为自动化安装平台: PXE(preboot execut ...
- scrapy--json(喜马拉雅Fm)(二)
学习了对数据的储存,感觉还不够深入,昨天开始对储存数据进行提取.整合和图像化显示.实例还是喜马拉雅Fm,算是对之前数据爬取之后的补充. 明确需要解决的问题 1,蕊希电台全部作品的进行储存 --scra ...