Workman(php)实时推送示例(thinkphp)与问题排查

workman

workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬件通讯、智能家居、物联网等领域的开发。

业务场景

目前接触到的场景大致分为两类:

  • 物联网方面;设备传感器传送回来的报警数据是实时展示给总控制台(如下图的多个报警数据统计图部分)
  • 实时消息推送;比如有系统有新的客户注册需要实时推送给相关业务员知晓等
    图1

代码实现

本质上其实就是服务端与客户端受代码逻辑控制下的数据交互。

GatewayWorker(服务端)

GatewayWorker基于Workerman开发的一个项目框架。因为绝大多数开发者的目标是基于Workerman开发TCP长连接应用,而长连接应用服务端有很多共同之处,例如它们有相同的进程模型以及单发、群发、广播等接口需求。所以才有了GatewayWorker框架,GatewayWorker是基于Workerman开发的一个TCP长连接框架,实现了单发、群送、广播等长连接必用的接口。

服务端部署(Linux)

在GatewayWorker官网下载对应的代码示例,在TP框架代码根目录下创建了一个workman的文件夹然后后将官方示例代码放入其中具体文件目录如下(不一定非要这么放个人习惯):
此处我在TP框架代码根目录下创建了一个workman的文件夹,让后将官方示例代码放入其中

核心代码介绍

首先需要注意的是start_gateway.php文件中对客户端外放的协议与端口(宝塔与安全组记得开放),具体代码位置如下:

// 需要注意的就是这句话
$gateway = new Gateway("tcp://0.0.0.0:8282");
//其中tcp指定的是协议,此处还可以写websocket,具体看客户端与服务端采用什么协议通讯(两者要使用相同的协议)
//其中8282是外放给客户端的通讯端口

其次就是业务逻辑处理部分,对应的文件是Events.php而通常用到的方法就是onMessage用来处理收到客户端发送的数据

//参数$client_id为当前连接服务端的客户端ID
//$message为客户端发来的数据
//此处仅仅是展示,根据实际情况自行修改
public static function onMessage($client_id, $message)
{
    $data = json_decode($message, true);//对数据进行解json处理(自行判断是否需要)
    $type=$data['type']; //通常给服务端发数据都会带一个类型字段用以区分消息
    switch ($type){
        //正常服务端会有心跳包给客户端,客户端也要在收到心跳包的时候反馈服务端以维持长连接
        case 'ping':
            return ;
            break;
        //客户端链接成功后会传一个业务上的数据身份(比如业务员数据库ID)给服务端用于数据绑定    
        case 'init':
            $uid=$data['id'];
            // 将当前连接的客户端ID与数据库中的uid绑定
            Gateway::bindUid($client_id, $uid);
            $message = array('type'=>"clock");
            // 给对应消息的客户端发初始化成功的消息
            GateWay::sendToUid($uid,json_encode($message));
            break;
    }
}
服务端启动

如上面的项目框架代码图片,进入Linux服务器项目根目录中的workman(就是自定义名字放GatewayWorker示例代码的目录)下切换www用户(这个不知道不切换行不行)执行命令:

php start.php start

成功运行截图(记得设置守护进程和开机启动):
在这里插入图片描述

主动推送

当有新的用户注册时,服务端需要主动推送消息给对应的客户端需要用到gatewayclient需要composer安装一下,示例代码如下:

//给用户发数据
public static function sendToUid($message, $admin_id)
{
	try {
			//客户端连接初始化时会绑定客户端ID与数据ID,此处检测一下这个数据ID对应的客户端ID是否在线
			if (gateway::isUidOnline($admin_id)) {
				//如果在线进行数据发送
				gateway::sendToUid($admin_id, json_encode($message, JSON_UNESCAPED_UNICODE));
			};
        } catch (\Exception $e) {
			//异常处理
        }
}

测试工具与Javascript(客户端)

在线测试工具

服务端启动成功以后我们可以百度一些在线连接工具测试一下连接是否成功,例如:WebSocket 在线测试 输入服务器IP以及上面文件中定义的外放端口(注意这个是测试websoket协议的服务端要对应上),点击连接之后出现右侧连接已建立说明服务端基本没有问题
在这里插入图片描述

JS连接

通常客户端方面我采用JS进行websocket协议进行连接,下面给出代码示例:

//建立WebSocket通讯,其中"ReconnectingWebSocket.js" 是一个 JavaScript 库,用于处理 WebSocket 连接断开后自动重新连接的功能百度自行下载提前引入即可
var socket = new ReconnectingWebSocket('ws://127.0.0.1/8282'); //此处改成自己的服务器IP与端口号

//连接成功时触发
socket.onopen = function () {
	console.log("服务连接成功!");
	//初始化用户信息 adminInfo看自己业务需求自己定义
	socket.send(adminInfo);
};

//监听收到的消息
socket.onmessage = function (res) {
	var data = eval("(" + res.data + ")");
	switch (data['type']) {
		//服务端心跳
		case 'ping':
			socket.send('{"type":"ping"}');
			break;
		//初始化成功
		case "clock":  //建立链接成功,定时刷新
			break;
		//服务端通知有新的数据
		case "message_update": //有新的消息
			console.log('有新的消息');
			layer.msg('您有新消息注意查收!', {'offset': '75%'});
			// ... 写新消息下的业务逻辑
			break;
	}
}

问题排查

  1. 当网站配置了https后,服务端使用'ws://127.0.0.1/8282'连接就会失败。即使改成'wss://127.0.0.1/8282' 或者wss://域名/8282还失败的可以采用nignx代理;

进入宝塔在网站配置页面,在配置文件中写入下面内容,具体位置可以看图片:

location /wss {
	proxy_pass http://127.0.0.1:9999;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "Upgrade";
	proxy_set_header X-Real-IP $remote_addr;
	proxy_read_timeout 3600s;
}

其中9999要改成实际服务端外放的端口号

在这里插入图片描述
客户端连接是写法如下:

//域名记得替换
var socket = new ReconnectingWebSocket('wss://www.baidu.com/wss');
  1. 后续如果遇到其他问题再进行补充;写的有点乱主要目的是方便自己查找(不喜勿喷)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊多模态大模型处理的思考

多模态:文本、音频、视频、图像等多形态的展现形式。目前部门内业务要求领域大模型需要是多模态——支持音频/文本。从个人思考的角度来审视下,审视下多模态大模型的实现方式。首先就要区分输入与输出,即输入的模态与输出的模态。从目前来看&…

为什么微软、谷歌没做成,第一个干这件事反而是亚马逊?

相信大家都熟悉云服务、云存储等应用,但是你知道是哪家公司最先提出这个概念的吗? 是的,微软、苹果还是英特尔? 事实上,事实并非如此。 亚马逊是全球第一个推出云服务的公司。 Web于2006年首次推出,即如今…

Mudbox 2025新版中文---数字雕刻与纹理绘画新境界

Mudbox 2025是一款功能强大的3D建模软件,以其卓越的建模能力和高效的创作工具而备受瞩目。它支持纹理烘烤、三维层、多分辨率网格编辑等功能,为用户提供了直观且易于操作的用户界面。 Mudbox 2025新版中文下载 功能特色: 强大的建模与雕刻能…

SpringBoot中的异步多线程使用及避坑指南

处理请求时需要考虑到系统的性能和响应速度。特别是在处理大量请求或者需要进行耗时操作时,采用异步多线程处理是一种常见的解决方案。Spring Boot提供了Async注解来支持异步方法调用,结合合适的线程池配置,可以很容易地实现异步多线程处理&a…

在 fstab文件中配置 UUID方式自动挂载数据盘、swap、目录(**)

linux如何挂在硬盘,自动挂载和手动挂载(详细说明)https://gitcode.csdn.net/65eedcea1a836825ed7a06f4.html 解决linux重启后磁盘挂载失效的问题 https://blog.csdn.net/sugarbliss/article/details/107033034 linux /etc/fstab 文件详细说…

非wpf应用程序项目【类库、用户控件库】中使用HandyControl

文章速览 前言实现方法1、首先需要在NuGet包管理器中添加HandyControl包;2、在Properties目录下添加DesignTimeResources;3、将其中内容替换为官网中于App.xaml添加的内容 参考文章 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共…

windows 下用使用api OCI_ConnectionCreate连接oracle报错 TNS:无法解析指定的连接标识符

背景,两台服务器系统一样,oracle版本一样,其中一台服务器在运行程序的时候报错 TNS:无法解析指定的连接标识符 但是PL/SQL可以正常连接,怀疑是oracle配置文件的原因 tnsnames.ora配置文件大概作用:是Oracle客户端的网…

Git的原理和使用(四):理解分布式版本控制系统与远程仓库的相关配置

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑都是一个完整的版本库&…

文案智能ai改写工具,文案改写很强大

文案智能ai改写工具可以说是文案编辑人员的得力助手,我们都知道文案的最终定稿还要经过后期的修改,基本也没有文案一写就立刻通过的,甚至有的文案是经过文案编人员多次改写通过,所以文案智能ai改写工具在文案修改的过程中起了很大…

机器人是怎么计时的(通用定时器 - 时基单元)

目录 一,引言 二,机器人的“大脑” 三,时基单元介绍 1,定时器框图 2,时基单元 (1)预分频器 (2)CNT计数器 (3)自动重装载寄存器 四&#…

Lilishop商城(windows)本地部署【docker版】

Lilishop商城(windows)本地部署【docker版】 部署官方文档:LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…

【python】flask模板渲染引擎Jinja2中的模板继承,简化前端模块化开发

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

FPGA时钟资源详解(2)——Clock-Capable Inputs

FPGA时钟系列文章总览:FPGA原理与结构(14)——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 1.1 为什么使用CC 1.2 如何使用CC 二、Clock-Capable Inputs 2.1 SRCC 2.2 MRCC 2.3 其他用途 2.3.1…

Ubuntu 系统下安装 Redis

目录 一、上传 Redis 安装包并解压缩 二、编译 1、安装gcc,不然后面编译报错 2、开始编译 三、生成后台服务 四、修改配置文件 1、设置密码 2、设置后台启动 五、启动服务 一、上传 Redis 安装包并解压缩 tar -zxvf redis-6.0.2.tar.gz 二、编译 1、安装g…

对话 Mines of Dalarnia: Web3 游戏创新,社区驱动与公链共建

作者:stellafootprint.network 嘉宾:Manfred Pack,Mines of Dalarnia 游戏开发总监 采访者:Alex Cooper,Footprint Analytics 北美社区与 BD 负责人 在区块链游戏领域,去中心化和玩家经济正在颠覆传统游戏…

【Java多线程】3——Lock API控制多线程

3 Lock API控制多线程 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记仓库👉https://github.com/A-BigTree/tree-learning-notes 个人主页👉https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个…

第18次修改了可删除可持久保存的前端html备忘录

第17次修改了可删除可持久保存的前端html备忘录&#xff1a;增加年月日星期&#xff0c;增加倒计时&#xff0c;更改保存区名称可以多个备忘录保存不一样的信息&#xff0c;匹配背景主题&#xff1a;现代深色 <!DOCTYPE html> <html lang"zh"> <head&…

SpringBoot国际化配置流程(超详细)

前言 最新第一次在做SpringBoot的国际化&#xff0c;网上搜了很多相关的资料&#xff0c;都是一些简单的使用例子&#xff0c;达不到在实际项目中使用的要求&#xff0c;因此本次将结合查询的资料以及自己的实践整理出SpringBoot配置国际化的流程。 SpringBoot国际化 "i…

智慧公厕四大核心能力,赋能城市公共厕所智能化升级

公共厕所是城市基础设施中不可或缺的一部分&#xff0c;但由于传统的公共厕所在建设与规划上&#xff0c;存在一定的局限性&#xff0c;导致环境卫生差、管理难度大、使用体验不佳等问题&#xff0c;给市民带来了很多不便。而智慧公厕作为城市智能化建设的重要组成部分&#xf…

谈谈变压器中的位置编码

变压器中的位置编码 一、说明 在上一期的“Transformers for Everyone”系列中&#xff0c;我们介绍了 Transformer 的概念&#xff0c;并深入研究了第一个关键架构元素&#xff1a;输入嵌入。如果你错过了第一集&#xff0c;你可以通过阅读来赶上&#xff1a;适合所有人的变形…