【备忘】thinkphp5.1之websocket长连接框架使用流程简述

前言

本文纯属经验备注,有许多地方未进行测试,请勿照搬,仅供参考。

之前专门花了几天时间测试了websocket,当时只记得踩了许多坑,但是没有对测试流程进行记录,导致长时间未使用从而无从下手。

今天就简单记录一下使用流程。

环境介绍

  • php7.4+
  • linux
  • nginx
  • thinkphp5.1
  • workerman

流程

1、安装长连接框架:composer require workerman/gateway-worker
2、配置基本参数配置文件为 config/gateway_worker.php(必须使用对应命令才能启动)配置端口startPort,pingData,eventHandler,其它默认就好eventHandler配置为app\index\logic\events\Events.php类,用于处理监听后的业务逻辑
3、启动服务唯一启动命令:php think worker:gateway
4、nginx服务配置以支持/wss方式访问参考配置:location /wss{proxy_pass http://127.0.0.1:2000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header X-Real-IP $remote_addr;}
5、JavaScript客户端建立连接并访问ws = new WebSocket("wss://bootest.playtest.top/wss");//这种访问方式需要nginx配置ws.onopen = function() {alert("连接成功");ws.send('hello,thinkphp');alert("给服务端发送一个字符串:hello,thinkphp");

详细配置参考(gateway_worker.php)

//gateway_worker.php 文件配置
<?php  
// +----------------------------------------------------------------------
// | Workerman设置 仅对 php think worker:gateway 指令有效
// +----------------------------------------------------------------------
return [/** 【长连接使用此配置,启动命令: php think worker:gateway  】 */// 扩展自身需要的配置'protocol'              => 'websocket', // 协议 支持 tcp udp unix http websocket text'host'                  => '0.0.0.0', // 监听地址'port'                  => 2000, // 监听端口'socket'                => '', // 完整监听地址'context'               => [], // socket 上下文选项'register_deploy'       => true, // 是否需要部署register'businessWorker_deploy' => true, // 是否需要部署businessWorker'gateway_deploy'        => true, // 是否需要部署gateway// Register配置'registerAddress'       => '127.0.0.1:1236',// Gateway配置'name'                  => 'thinkphp','count'                 => 1,'lanIp'                 => '127.0.0.1','startPort'             => 1350,'daemonize'             => false,'pingInterval'          => 30,'pingNotResponseLimit'  => 0,//这里根据自己需要配置,不一定使用json'pingData'              => '{"code":"200","msg":"ok","action":"ping"}',// BusinsessWorker配置'businessWorker'        => ['name'         => 'BusinessWorker','count'        => 1,
//        'eventHandler' => '\think\worker\Events',//这里配置事件监听后的业务逻辑处理代码,Events.php类'eventHandler' => 'app\index\logic\events\Events',],];

Events类(定制业务逻辑)

上面eventHandler类对应的文件

<?phpnamespace app\index\logic\events;use app\index\logic\Baselogic;
use GatewayWorker\Lib\Gateway;
use think\worker\Application;
use wanghua\general_utility_tools_php\tool\Tools;
use Workerman\Worker;/*** 事件监听后的业务逻辑(自由定制)*/
class Events extends \think\worker\Events
{/*** onWorkerStart 事件回调* 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次** @access public* @param  \Workerman\Worker    $businessWorker* @return void*/public static function onWorkerStart(Worker $businessWorker){$app = new Application;$app->initialize();}/*** onConnect 事件回调* 当客户端连接上gateway进程时(TCP三次握手完毕时)触发** @access public* @param  int       $client_id* @return void*/public static function onConnect($client_id){//一个连接只触发一次Tools::log_to_write_text('客户端完成TCP握手');$res = Tools::set_ok('ok','onConnect',['client_id'=>$client_id]);Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));}/*** onWebSocketConnect 事件回调* 当客户端连接上gateway完成websocket握手时触发** @param  integer  $client_id 断开连接的客户端client_id* @param  mixed    $data {"get":[],"server":{"REQUEST_METHOD":"GET","REQUEST_URI":"/wss","SERVER_PROTOCOL":"HTTP/1.1","HTTP_UPGRADE":"websocket","HTTP_CONNECTION":"Upgrade","HTTP_X_REAL_IP":"183.227.89.107","HTTP_HOST":"127.0.0.1:2000","SERVER_NAME":"127.0.0.1","SERVER_PORT":"2000","HTTP_PRAGMA":"no-cache","HTTP_CACHE_CONTROL":"no-cache","HTTP_USER_AGENT":"wechatdevtools desktopapp appservice port/62717 token/589065e467011760c777411fca2cd0aa runtime/2 MicroMessenger","HTTP_ORIGIN":"https://boomim.playone.cn","HTTP_SEC_WEBSOCKET_VERSION":"13","HTTP_ACCEPT_ENCODING":"gzip, deflate, br","HTTP_ACCEPT_LANGUAGE":"zh-CN,zh;q=0.9","HTTP_CONTENT_TYPE":"application/json","HTTP_REFERER":"https://servicewechat.com/wx55e10fb2834803d5/devtools/page-frame.html","HTTP_SEC_WEBSOCKET_KEY":"uWOWC1AZahJOpS18hN3ZHA==","HTTP_SEC_WEBSOCKET_EXTENSIONS":"permessage-deflate; client_max_window_bits","QUERY_STRING":""},"cookie":[]}* @return void*/public static function onWebSocketConnect($client_id, $data){//        var_export($data);//对应客户端打开连接, 一个连接只触发一次Tools::log_to_write_text(['客户端打开了websocket连接',$data]);//$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'客户端打开连接时,发送到服务端的消息:','data'=>$data]);////Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));}/*** onMessage 事件回调* 当客户端发来数据(Gateway进程收到数据)后触发** @access public* @param  int       $client_id* @param  mixed     $data* @return void*/public static function onMessage($client_id, $data){Tools::log_to_write_text(['客户端发来数据(Gateway进程收到数据).client_id:'.$client_id,$data]);//$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'你发来的消息我接收到了:',$client_id=>$data]);//Gateway::sendToClient($client_id,json_encode($res,JSON_UNESCAPED_UNICODE));}/*** onClose 事件回调 当用户断开连接时触发的方法** @param  integer $client_id 断开连接的客户端client_id* @return void*/public static function onClose($client_id){//GateWay::sendToAll("client[$client_id] logout\n");Tools::log_to_write_text(['断开连接.client_id:'.$client_id]);}/*** onWorkerStop 事件回调* 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。** @param  \Workerman\Worker    $businessWorker* @return void*/public static function onWorkerStop(Worker $businessWorker){//echo "WorkerStop\n";Tools::log_to_write_text(['businessWorker进程退出时触发。每个进程生命周期内都只会触发一次.',$businessWorker]);}
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08.Elasticsearch应用(八)

Elasticsearch应用&#xff08;八&#xff09; 1.为什么需要相关性算分 我们在文档搜索的时候&#xff0c;匹配程度越高的相关性算分越高&#xff0c;算分越高的越靠前&#xff0c;但是有时候我们不需要算分越高越靠前我们可能需要手动影响算分来控制顺序比如广告&#xff08…

2016年认证杯SPSSPRO杯数学建模A题(第一阶段)洗衣机全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 A题 洗衣机 原题再现&#xff1a; 洗衣机是普及率极高的家用电器&#xff0c;它给人们的生活带来了很大的方便。家用洗衣机从工作方式来看&#xff0c;有波轮式、滚筒式、搅拌式等若干种类。在此基础上&#xff0c;各厂商也推出了多种具体方案…

微信小程序(十五)自定义导航栏

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.组件文件夹创建方法 2.自定义组件的配置方法 3.外部修改组件样式&#xff08;关闭样式隔离或传参&#xff09; 创建组件文件夹 如果是手动创建建议注意在json文件声明&#xff1a; mynav.json {//声明为组件可…

从CDN了解到的边缘计算与前端渲染

文章概叙 本文代码量较少&#xff0c;讲的是在云开发的基础上使用边缘计算的&#xff0c;代码量不高&#xff0c;​建议看完理解下就可以丢了&#xff0c;知道个概念就好。 废话1 第一次接触边缘计算是在2020年的时候&#xff0c;公司的cloud课程中&#xff0c;有一些相关概…

2024年第四届机器人与人工智能国际会议(JCRAI 2024) | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第四届机器人与人工智能国际会议(JCRAI 2024) 会议时间&#xff1a;2024年8月9日-11日 召开地点&#xff1a;中国上海 大会官网&#xff1a;www.jcrai.org 人工智能和机器人技术在过去几十年里得到了长足的发展&#xff0c;为未来的机器人应…

php二次开发股票系统代码:腾讯股票数据接口地址、批量获取股票信息、转换为腾讯接口指定的股票格式

1、腾讯股票数据控制器 <?php namespace app\index\controller;use think\Model; use think\Db;const BASE_URL http://aaaaaa.aaaaa.com; //腾讯数据地址class TencentStocks extends Home { //里面具体的方法 }2、请求接口返回内容 function juhecurl($url, $params f…

力扣刷题 第十二 边权重均等查询

现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi, wi] 表示树中存在一条位于节点 ui 和节点 vi 之间、权重为 wi 的边。 另给你一个长度为 m 的二维整数数…

2024年华为OD机试真题-靠谱的车-Python-OD统一考试(C卷)

题目描述: 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。 比如: 1. 23再多一块钱就变为25; 2. 39再多一块…

yum找不到 mysql-server

User sudo yum install mysql-server 已加载插件&#xff1a;fastestmirror Loading mirror speeds from cached hostfile base: mirrors.aliyun.comepel: mirror.01link.hkextras: mirrors.ustc.edu.cnupdates: mirrors.ustc.edu.cn 没有可用软件包 mysql-server。 错误&…

C++算法学习心得七.贪心算法(2)

1.跳跃游戏&#xff08;55题&#xff09; 题目描述&#xff1a; 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1: 输入: [2,3,1,1,4]输出: true解释: 我们…

【前端基础--4】

定位属性 position 可以将元素定位到你想要放到位置&#xff0c;使用方位值来进行移动(top,left,right,bottom)。 1.相对定位 position: relative; top: 20px; left: 20px; 以自身为定点进行移动&#xff0c;不会脱离文档流。 不会影响元素本身的性质&#xff1b;块级…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述&#xff0c;然后着重地对移动端的 GPU 进行了分析&#xff0c;随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 &#x1f3ac;个人简介…

RisingWave 多流 Join 实现高效实时数据打宽

在公司业务场景中&#xff0c;通常需要使用流计算引擎从多个数据源获取数据、进行 ETL 操作&#xff0c;并将清洗后的数据导入到数据分析系统或数据湖中。由于最后产生出来的表是一张宽表&#xff0c;我们通常也称这个过程为“数据打宽“。 数据打宽在流处理系统中对应的操作便…

34.在排序数组中查找元素的第一个和最后一个位置(力扣LeetCode)

文章目录 34.在排序数组中查找元素的第一个和最后一个位置题目描述二分 34.在排序数组中查找元素的第一个和最后一个位置 题目描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组…

将小游戏打包成单一exe文件的原理及应用

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01;本文将介绍将小游戏原版文件打包成单一exe文件的原理&#xff0c;并探讨了这种打包方式的优点和应用场景。通过对打包工具和编译器的介绍&#xff0c;解释了它们如何将游戏的所有相关文件合并到一个…

Fiddler 过滤地址设置及导出JMeter脚本插件原理

Fiddler 过滤地址设置 1、在fiddler右边工具栏中找到Filters过滤器->勾选&#xff1a;Use Filters->在hosts中选择过滤规则和要过滤的地址。 如下图&#xff1a; 2、点击【Actions】按钮&#xff0c;选择&#xff1a;Run Filterset now&#xff0c;就会立即生效&#x…

nginx限制ip访问

先看一下被禁止的效果 如何配置 禁止访问的话直接在location模块增加类似如下配置 deny all; 完整示例 location / {deny all;root html;index index.html index.htm;} 默认是allow all就是允许所有ip访问,如果只配置指定ip可以访问是无效的,还是所有的ip可以访问 无效示例…

Unity动画桢事件

1&#xff0c;使用原因 在新项目内部审核的时候&#xff0c;说什么动画节奏不匹配&#xff0c;所以决定用动画桢事件来处理技能释放。当释放技能的时候&#xff0c;先播放技能动画&#xff0c;然后再动画桢所在的时间戳执行技能的逻辑。 2&#xff0c;具体实现 1&#xff0c;…

v3+ECharts 地图实现多个自定义图片的图标

备注&#xff1a;地图json, 图标图片 准备替换下 <template><div ref"mapEcharts" class"map-echart"></div> </template><script setup langts> import * as echarts from echarts import mapcity from "/tool/map/m…

【SpringBoot篇】springboot的自动装配原理

文章目录 &#x1f3f3;️‍&#x1f308;什么是自动装配&#x1f339;SpringBoot的自动装配&#x1f354;具体操作 &#x1f3f3;️‍&#x1f308;什么是自动装配 自动装配&#xff08;Auto-Configuration&#xff09;是Spring Boot框架的一个核心特性之一&#xff0c;它通过…