本教程会详细介绍配置的方法,以给全体用户发送通知为例。

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的更多相关文章

  1. laravel5.5事件广播系统

    目录 1. 定义广播事件 1.1 广播名称 1.2 广播数据 1.3 广播队列 1.4 广播条件 2. 频道授权 2.1 定义授权路由 2.2 定义授权回调 3. 对事件进行广播 3.1 可以使用ev ...

  2. laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到

    laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...

  3. laravel 使用Redis

    1.非框架中使用redis实例? 就是new出redis对象然后连接,然后键值操作即可 <?php $redis = new redis(); $redis->connect('127.0 ...

  4. laravel 操作 redis

    laravel框架中本身已经存在相应的redis的配置我们在使用的时候只需要更改配置即可,但是在使用的时候一定要注意命名空间的问题,具体可查看config/app.php下面的aliases数组中具体 ...

  5. Laravel安装redis扩展

    Laravel安装redis扩展 1.使用命令行,执行(当然要先安装composer) composer require predis/predis 2.执行完就安装好了,redis相关配置可以到.e ...

  6. Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  7. PHP实现事件机制实例分析

    PHP实现事件机制实例分析 内置了事件机制的语言不多,php也没有提供这种功能.事件(Event)说简单了就是一个Observer模式.实现起来非常easy.可是有所不同的是,事件的监听者谁都能够加, ...

  8. [PHP] Laravel5.5 使用 laravel-cors 实现 Laravel 的跨域配置

    Laravel5.5  使用 laravel-cors 实现 Laravel 的跨域配置 最开始的时候,我使用的是路由中间件的方式,但是发现中间件不起作用 这是之前使用的方式: 'cros' => ...

  9. [PHP] Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

随机推荐

  1. 关于VisualStudio2010发布项目问题

    VisualStudio2010速度还是很给力的,VS2015打开机器就双100%了:VS2010机器上跑起来还是很好用的. 今天编译一个MVC3.0项目,发布时候出现诡异现象:Content文件夹里 ...

  2. C++ POD类型

    POD( Plain Old Data)概念: Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to m ...

  3. POJ-1509 Glass Beads---最小表示法模板

    题目链接: https://vjudge.net/problem/POJ-1509 题目大意: 给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 解题思路: 最小表示法模板 注 ...

  4. python 3+djanjo 2.0.7简单学习(二)--创建数据库和模型

    我们紧接上次,这里将建立数据库,创建第一个模型提示:这里我们不需要去一直启动,django会在我们ctrl+s的时候自动刷新并启动服务,很方便吧  1.数据库配置 现在,打开 vote_mysite/ ...

  5. 2018.7.5 jQuery学习

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. mac 开机白屏,卡进度条,无法进入系统

    几个月前我的老Mac又一次的坏掉了,现在想起来就记录一下,哎,话说Apple的东西吧,好用是好用,一般都不会坏,质量保证,但是如果一旦坏了,那就是大问题!(坏了第一时间就应该打电话给apple客服小姐 ...

  7. 写一个addEventListener以及removeEventListener

    第一步:对象属性赋值为函数,对象内部函数控制年龄这一参数变化,同时成长事件也执行. class Person{ constructor(){ this.name = ''; this.age = 0; ...

  8. 使用工具Android Studio实现一个简单的Android版的新闻APP

    目的: 这是我学完Android课程后所写的一个小的.简单版的新闻APP 技术概要: 用到了SQLite数据库,用它来存储每篇新闻下的评论 新闻的来源是新浪新闻,我通过使用Fiddler来对新浪新闻A ...

  9. vim 个性化设置和操作

    一.vim 设置 1. 设置行号显示 1) 临时显示 命令行模式 :set nu 2) 永久显示 # vim ~/.vimrc 插入一行代码: set number 若没有该文件,在用户主目录 (/h ...

  10. JS - 给数组的原型添加去掉重复元素的distinct方法

    /* 调用完该方法,原数组只留下非重复的数据 返回一个数组,里面是依次出现的重复元素 */Array.prototype.distinct = function () {    var removeA ...