websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程

环境要求:

  • Laravel 框架 (5.8 版本)
  • Redis 服务

1.安装 laravel-echo-server

首先我们需要全局安装 laravel-echo-server ,终端输入下面的命令

npm install -g laravel-echo-server

安装完成后,打开你的 Laravel 应用,或新启一个测试项目

 composer create-project --prefer-dist laravel/laravel echo-test

安装 Predis :

composer require predis/predis

初始化 Socket 服务:

如果你是linux,命令会找不到,推荐你看下这篇帖子

linux下npm安装的全局命令无法执行

laravel-echo-server init

执行这条命令后,会询问你一些关于 Socket 服务的配置信息

// 是否在开发模式下运行此服务器(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 start  启动

laravel-echo-server stop  停止

如果出现报错,先去启动你的redis 确认启动无误后开始配置 .env

BROADCAST_DRIVER=redis

QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

2.安装 Socket.io 客户端和 Laravel-Echo

在这之前建议运行一下 npm install

npm install --save socket.io-client
npm install --save laravel-echo

现在我们先准备客户端的事情 resources/js/app.js 修改app.js,如果不是5.8自行找对应目录文件

import Echo from 'laravel-echo'

window.io = require('socket.io-client');
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});

终端运行

npm run dev

引入到页面,我就是先拿首页来测试了resources/views/welcome.blade.php

// 头部加入
<meta name="csrf-token" content="{{ csrf_token() }}"> // 引入app.js
<script src="js/app.js"></script> // 监听并输出
<script> // ’user1'是频道,‘ExampleEvent’ 是监听的事件(这是事件的类名,你也可以根据你的需要自定义)
window.Echo.channel('user1')
.listen('ExampleEvent', (e) => {
console.log(e);
});
</script>

3.开始准备事件,在对应的频道上进行广播

创建一个ExampleEvent事件

php artisan make:event ExampleEvent

这时在 App/Events 目录下面会创建一个叫做 ExampleEvent.php 的事件类

事件类继承于 ShouldBroadcast 接口

class ExampleEvent implements ShouldBroadcast

找到  broadcastOn  函数,在对应的频道上进行广播

    // user1就是频道
public function broadcastOn()
{
return new Channel('user1');
//return new PrivateChannel('channel-name');
} // 触发事件时返回的数据
public function broadcastWith()
{
return [
'data' => 'success!'
];
}

现在添加一条路由用来测试,这里也可以通过控制器去发送,相关看事件文档

Route::get('user1', function(){
broadcast(new \App\Events\ExampleEvent);
});

现在启动监听事件

php artisan queue:listen --tries=1

现在我们可以开始测试,先打开首页,如果你定义了其他路由自行打开,我就默认的欢迎页面

如果看到下面页面  恭喜你已经和服务器连接上了

客户端运行时的状态

服务端运行时的状态

现在我们打开事件路由广播一条消息,打开另一个页面访问  /user1,如果你设定了控制器访问对应的路由就是了,访问以后是空白不必紧张,我们先在终端看看队列,如果什么都没有输出,自行检查redis相关配置,以及查看redis库内是否有数据。正确会看到下面图,刷新一次页面会出现一条

如果正常就可以略过这一步了,基本都是5.8版本的问题,其他也没测试,我们先看看服务端显示什么

频道自动加了前缀

找到config/database.php配置文件

'options' => [
'cluster' => env('REDIS_CLUSTER', 'predis'),
// 删掉这一行或是注释掉
'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
],

然后我们再次重新启动服务和队列,刷新两个页面

就可以正常接收消息了

为什么会自动发送  2,3,因为这是 Engine .io协议

数据包编码 命令   含义
0 open 在打开新传输时从服务器发送(重新检查)
1 close 请求关闭此传输,但不关闭连接本身。
2 ping 由客户端发送。服务器应该用包含相同数据的乓包应答

示例1.客户端发送:2probe 2.服务器发送:3probe
3 pong 由服务器发送以响应ping数据包
4 message 实际消息,客户端和服务器应该使用数据调用它们的回调。

实施例1

服务器发送:4HelloWorld客户端接收并调用回调socket.on('message',function(data){console.log(data);});

实施例2

客户端发送:4HelloWorld服务器接收并调用回调socket.on('message',function(data){console.log(data);})
5 upgrade 在engine.io切换传输之前,它测试,如果服务器和客户端可以通过这个传输进行通信。如果此测试成功,客户端发送升级数据包,请求服务器刷新其在旧传输上的缓存并切换到新传输。
6 noop noop数据包。主要用于在接收到传入WebSocket连接时强制轮询周期。

websocket 后台新订单通知 —— Laravel 5.8 Laravel-echo-server教程的更多相关文章

  1. 5.Fanout交换机之新订单通知商户场景

    标题 : 5.Fanout交换机之新订单通知商户场景 目录 : RabbitMQ 序号 : 5 const string newOrderQueueName = "neworder-queu ...

  2. PHP使用AJax轮询实现新订单实时提醒

    业务逻辑:Ajax每隔10秒钟请求一次接口,该接口会去查询数据库是否有新的订单,如果有则返回新订单的数量,后台收到声音提示,更改后台提醒数量 提醒框可链接到订单列表,后台更改完订单状态后会提醒会消失 ...

  3. Zencart先生成订单后付款,类似淘宝后台修改订单价格

    Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单.导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完 ...

  4. websocket后台数据推送

    Websocket定义: 说明: 作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas.本地存储.多媒体编程接口.WebSocket 等等.这其中有“Web 的 TCP ...

  5. ECshop后台新功能权限添加

    ecshop后台新功能权限的添加 1.在后台“推荐管理”里添加“推荐人分成”.“会员分成”两个操作功能以及权限 index.php?act=menu incluedes/inc_priv.php:权限 ...

  6. iOS 10 的一个重要更新-新的通知推送 API

    iOS 10 最重要的变化可能就是通知 API 的重构了.本文用一个简单闹钟的例子介绍了 User Notification 的 API 变化和新功能. 简介 很久以前,开发者就可以在 iOS 里预约 ...

  7. 在ECSHOP后台的订单列表中显示配送方式

    熟悉ECSHOP后台的人都知道,只有点击某个具体的订单,进入订单详细页面才能看到该订单的配送方式,最模板修改的目的,是想让管理者在订单列表页面 就能看到该订单的配送方式. 下面是修改方法:首先来修改 ...

  8. Laravel 从入门到精通系列教程

    转载;https://laravelacademy.org/laravel-tutorial-5_7 适用于 Laravel 5.5.5.6.5.7 版本,本系列教程将围绕一个 LTS 版本,然后采取 ...

  9. Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解

    1.简介 本文主要给大家介绍了关于Laravel 5用Laravel Excel实现Excel/CSV文件导入导出的相关内容,下面话不多说了,来一起看看详细的介绍吧. Laravel Excel 在 ...

  10. Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程

    1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显示调试及错误信息以方便开发.该扩展包包含了一个 ServiceProvider 用于注 ...

随机推荐

  1. Qt加载天地图离线api开发包/从官网趴地图js代码/费了九牛二虎之力终于搞定

    一.前言说明 网上关于如何趴天地图离线api文件的文章,只有少量的两三篇,而且几乎没有说全和说对,搞得评论也是一片懵逼,这里不行那你不行,思路可以借鉴就是.索性花了点时间,自己研究了如何从官网一步步趴 ...

  2. Qt编写可视化大屏电子看板系统22-平滑曲线图

    一.前言 平滑曲线是所有涉及到曲线图的项目中,绕不开的一个话题,尽管很多人爱看折线图,但是很多时候来个平滑曲线图,会更加赏心悦目,这就好比现在的手机app移动客户端上,从最初的四方四正到现在的平滑圆角 ...

  3. Qt编写安防视频监控系统61-子模块5设备控制

    一.前言 设备控制模块,和云台控制模块都是用的onvif协议通信,可以对选中的通道的摄像机(ONVIF协议),进行获取参数.设置参数.手动校时.重启设备.抓拍图片.模拟报警等操作,可以对摄像机的明亮度 ...

  4. 最新AI智能体开发案例:Coze工作流必备神器!教你用Coze平台搭建「扣子工作流生成神器」智能体!

    点击 疯狂老包  > 点击右上角"···" > 关注我 各位小伙伴们,大家好呀!我是疯狂老包.我精心打造的<疯狂AI智能体开发:100个实战案例, 从 入门到精通 ...

  5. 深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点

    今天,我们将重点探讨对接的业务逻辑.为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与<月之暗面>中的Moonshot两个案例来阐述这一点.通过这样的对比,大家可以更清晰地看 ...

  6. 巧用VTable打造炫酷金字塔图表

    在数据分析和可视化领域,表格是展示数据直观.有效的方式之一.今天,就让我们来探索如何利用VTable这个强大的表格组件,制作出既美观又富有信息量的金字塔图表,以及深入了解VTable中各种单元格类型的 ...

  7. c++:-8

    上一节学习了C++的STL库和范型:c++:-7,本节学习c++的输入输出和流类库. I/O流 (1)程序与外界环境的信息交换 当程序与外界环境进行信息交换时,存在着两个对象:程序中的对象.文件对象. ...

  8. flutter真机调试出现flutter Launching 'app' on No Devices.

    1. flutter真机调试出现flutter Launching 'app' on No Devices. flutter Launching 'app' on No Devices. 我的是华为手 ...

  9. DeepSeek,你是懂.NET的!

    这两天火爆出圈的话题,除了过年,那一定是DeepSeek!你是否也被刷屏了? DeepSeek 是什么 DeepSeek是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解 ...

  10. CPU的指令周期

    本文分享自天翼云开发者社区<CPU的指令周期>,作者:冯****怡 指令周期(Instruction Cycle) CPU中会有 存器.指令寄存器.控制器等多类单元.指令集,就是CPU中用 ...