环境:基于composer引入包和thinkphp6+https+workerman.
1.composer引入gatewayworker 使用phpstorm更方便(在composer.json中require中添加这些 phpstorm会自动引入) 或者使用命令行 composer require XXX
```
`"workerman/workerman"``:``"^4.0"``,`
`"workerman/gateway-worker"``:``"^3.0"``,`
`"workerman/gatewayclient"``:``"^3.0"``,`
```
0.编写workerman启动文件 workerman单独部署的 与你的项目无关 public/workerman.php(这个用来测试workman启动的-------------------)
```
`<?php`
`// +----------------------------------------------------------------------`
`// | ThinkPHP [ WE CAN DO IT JUST THINK ]`
`// +----------------------------------------------------------------------`
`// | Copyright (c) 2006-2019 http://thinkphp.cn All rights reserved.`
`// +----------------------------------------------------------------------`
`// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )`
`// +----------------------------------------------------------------------`
`// | Author: liu21st <liu21st@gmail.com>`
`// +----------------------------------------------------------------------`
`// [ wokerman启动文件 和整个项目无关联]`
`namespace``think;`
`use``Workerman\Worker;`
`require_once``__DIR__ .``'/../vendor/workerman/workerman/Autoloader.php'``;`
`// 创建一个Worker监听2345端口,使用http协议通讯`
`$http_worker``=``new``Worker(``"http://0.0.0.0:2345"``);`
`// 启动4个进程对外提供服务`
`$http_worker``->``count``= 4;`
`// 接收到浏览器发送的数据时回复hello world给浏览器`
`$http_worker``->onMessage =``function``(``$connection``,``$data``)`
`{`
`// 向浏览器发送hello world`
`// $connection->send('hello world');`
`};`
`// 运行worker`
`Worker::runAll();`
```
2.利用命令创建workerman php think make:command workerman 并编写文件app/command/Workerman.php
```
`<?php`
`//declare (strict_types=1);`
`namespace``app\command;`
`use``GatewayWorker\BusinessWorker;`
`use``GatewayWorker\Gateway;`
`use``GatewayWorker\Register;`
`use``think\console\Command;`
`use``think\console\Input;`
`use``think\console\input\Argument;`
`use``think\console\input\Option;`
`use``think\console\Output;`
`use``Workerman\Worker;`
`require_once``__DIR__ .``'/../../vendor/workerman/workerman/Autoloader.php'``;`
`class``Workerman``extends``Command`
`{`
`protected``function``configure()`
`{`
`// 指令配置`
`$this``->setName(``'workerman'``)`
`->setDescription(``'the workerman command'``);`
`}`
`protected``function``execute(Input``$input``, Output``$output``)`
`{`
`$this``->startGateWay();`
`$this``->startBusinessWorker();`
`$this``->startRegister();`
`Worker::runAll();`
`}`
`private``function``startBusinessWorker()`
`{`
`$worker``=``new``BusinessWorker();`
`$worker``->name =``'BusniessWorker'``;`
`$worker``->``count``= 1;`
`$worker``->registerAddress =``"127.0.0.1:1236"``;`
`$worker``->eventHandler = \app\workerman\Events::``class``;`
`}`
`private``function``startGateWay()`
`{`
`$gateway``=``new``Gateway(``"websocket://127.0.0.1:2346"``);`
`$gateway``->name =``'Gateway'``;`
`$gateway``->``count``= 1;`
`$gateway``->lanIp =``'127.0.0.1'``;`
`$gateway``->startPort = 2300;`
`$gateway``->pingInterval = 30;`
`$gateway``->pingNotResponseLimit = 0;`
`$gateway``->pingData =``'{"type":"heart"}'``;`
`$gateway``->registerAddress =``"127.0.0.1:1236"``;`
`}`
`private``function``startRegister()`
`{`
`new``Register(``'text://127.0.0.1:1236'``);`
`}`
`}`
```
3.定义workerman监听调用方法 heart心跳检测
```
`public``function``workerman_message(``$admin_id``=``''``,``$content``=``''``){`
`Gateway::``$registerAddress``=``'0.0.0.0:1236'``;`
`// 向任意uid的网站页面发送数据`
`$uid``=``$admin_id``;`
`$admin``= SystemAdmin::find(``$admin_id``);`
`$message``=``new``\stdClass();`
`$message``->type=``'send'``;`
`if``(``$uid``){`
`$message``->from=``$admin_id``??``''``;`
`$message``->from_name=``$admin``[``'username'``]??``'后台消息'``;`
`$message``->from_avatar=``$admin``[``'head_img'``]??``'https://www.huixx.cn/upload/20200828/e68c50db7b27c784b13a13b87c8ffc71.png'``;`
`$message``->content=``$content``;`
`Gateway::sendToUid(``$uid``, json_encode(``$message``,JSON_UNESCAPED_UNICODE));`
`}``else``{`
`$message``->from_name=``'后台提醒'``;`
`$message``->from_avatar=``'https://www.huixx.cn/upload/20200828/e68c50db7b27c784b13a13b87c8ffc71.png'``;`
`$message``->content=``$content``;`
`Gateway::sendToAll(json_encode(``$message``,JSON_UNESCAPED_UNICODE));`
`}`
`}`
```
4.前端开启websocket监听 加载html提示框
```
`/**`
`* 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,`
`* 其中端口为Gateway端口,即start_gateway.php指定的端口。`
`* start_gateway.php 中需要指定websocket协议,像这样`
`* $gateway = new Gateway(websocket://0.0.0.0:7272);`
`*/`
`Notification.requestPermission();`
`let``protocol = location.protocol ===``'https:'`
`?``'wss://test.huixx.cn/wss/'`
`:``'ws://0.0.0.0:2346'``;`
`ws =``new``WebSocket(protocol);`
`console.log(``'websocket启动'``)`
`// 服务端主动推送消息时会触发这里的onmessage`
`ws.onmessage =``function``(e) {`
`// json数据转换成js对象`
`var``data = eval(``"("``+ e.data +``")"``);`
`var``type = data.type ? data.type :``""``;`
`switch``(type) {`
`case``0:`
`break``;`
`case``"connect"``:`
`console.log(``'连婕socket成功!'``);`
`/*进行id绑定*/`
`var``url =``'/workerman/bind'``;`
`var``data_post = {`
`client_id: data.id,`
`};`
`$.post(url, data_post,``function``(re) {`
`var``r = /^[0-9]*$/;`
`if``(r.test(re)) {`
`console.log(``'绑定uid:'``+ re +``"成功"``);`
`}`
`},``'json'``);`
`//查询未接收消息数 并且放置`
`break``;`
`case``"heart"``:`
`console.log(``'心跳检测正常'``);`
`break``;`
`/*接受到消息的处理*/`
`case``"send"``:`
`//更新在线聊天按钮`
`console.log(data);`
`layer.msg(data.content)`
`var``domain =``'https://'``+ document.domain;`
`var``icon =``''``;`
`if``(data.from_avatar.indexOf(``'https'``) != -1) {`
`icon = data.from_avatar;`
`}``else``{`
`icon = domain + data.from_avatar;`
`}`
`var``notification =``new``Notification(data.from_name, {`
`body: data.content,`
`icon: data.from_avatar`
`});`
`notification.onclick =``function``() {`
`window.focus();`
`notification.close();`
`}`
`break``;`
`default``:`
`console.log(data)`
`}`
`};`
```
其他,因为配置了https 所以要wss然后呢要在nginx中做相关配置 如果是http则无需配置 具体参考文档:http://doc.workerman.net/faq/secure-websocket-server.html
```
`location``/wss``{`
`proxy_pass http:``//127``.0.0.1:2346;`
`proxy_http_version 1.1;`
`proxy_set_header Upgrade $http_upgrade;`
`proxy_set_header Connection``"upgrade"``;`
`}`
```
注意上述代码关系到的端口均要在云服务器开通 在云上开通。
- thinkphp6执行流程(一)
- php中use关键字用法详解
- Thinkphp6使用腾讯云发送短信步骤
- 路由配置
- Thinkphp6,static静态资源访问路径问题
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳实践
- Thinkphp6.0 搜索器使用方法
- 从已有安装包(vendor)恢复 composer.json
- tp6with的用法,表间关联查询
- thinkphp6.x多对多如何添加中间表限制条件
- thinkphp6 安装JWT
- 缓存类型
- 请求信息和HTTP头信息
- 模型事件用法
- 助手函数汇总
- tp6集成Alipay 手机和电脑端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6笔记
- TP6(thinkphp6)队列与延时队列
- thinkphp6 command(自定义指令)
- command(自定义指令)
- 本地文件上传
- 缓存
- 响应
- 公共函数配置
- 七牛云+文件上传
- thinkphp6:访问多个redis数据源(thinkphp6.0.5 / php 7.4.9)
- 富文本编辑器wangEditor3
- IP黑名单
- 增删改查 +文件上传
- workerman 定时器操作控制器的方法
- 上传文件到阿里云oss
- 短信或者邮箱验证码防刷代码
- thinkphp6:访问redis6(thinkphp 6.0.9/php 8.0.14)
- 实现关联多个id以逗号分开查询数据
- thinkphp6实现邮箱注册功能的细节和代码(点击链接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成带logo的二维码(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql数据库使用事务(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,创建过滤IP的中间件
- 源码解析请求流程
- 验证码生成
- 权限管理
- 自定义异常类
- 事件监听event-listene
- 安装与使用think-addons
- 事件与多应用
- Workerman 基本使用
- 查询用户列表按拼音字母排序
- 扩展包合集
- 查询用户数据,但是可以通过输入用户昵称来搜索用户同时还要统计用户的文章和粉丝数
- 根据图片的minetype类型获取文件真实拓展名思路
- 到处excel
- 用imagemagick库生成缩略图
- 生成zip压缩包并下载
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源码分析三】 APP类之父, 容器Container类
- thinkphp6表单重复提交解决办法
- 小程序授权
- 最简单的thinkphp6导出Excel
- 根据访问设备不同访问不同模块
- 服务系统
- 前置/后置中间件
- 给接口api做签名验证(php 8.1.1 / thinkphp v6.0.10LTS )
- 6实现邮箱注册功能的细节和代码(点击链接激活方式)
- 使用前后端分离的验证码(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分离:用jwt+middleware做用户登录验证(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分离多图上传
- thinkphp 分组、页面跳转与ajax
- thinkphp6 常用方法文档
- 手册里没有的一些用法
- Swagger 3 API 注释
- PHP 秒级定时任务
- thinkphp6集成gatewayWorker(workerman)实现实时监听
- thinkphp6按月新增数据表
- 使用redis 实现消息队列
- api接口 统一结果返回处理类
- 使用swoole+thinkphp6.0+redis 结合开发的登录模块
- 给接口api做签名验证
- ThinkPHP6.0 + UniApp 实现小程序的 微信登录
- ThinkPHP6.0 + Vue + ElementUI + axios 的环境安装到实现 CURD 操作!
- 异常$e
- 参数请求验证自定义和异常错误自定义