TP项目启用websocket聊天功能 - gateway、wss、swoole、长连接 - PHP

news2024/11/15 20:40:52

TP项目启用websocket聊天功能

须知

  1. swoole不支持windows安装,没有windows扩展
  2. WebSocket 在线测试(可测本地wss连接) websocket在线测试
  3. 建议gateway只负责给终端发信,不参与逻辑部分
  4. 后台负责所有的收信+发信安排,可以方便地获取用户好友关系、上下线状态管理、消息缓存、已读未读

整体安装顺序

  1. 【任务-1】在TP项目.env配置中添加
    # 聊天室-websocket长连接
    [WORKER]
    NAME = businessWorker
    PORT = 8282
    COUNT = 2
    START_PORT = 2900
    REGISTER_ADDRESS = 127.0.0.1:1236
    lAN_IP = 127.0.0.1
    REGISTER_DEPLOY = true

  2. 【任务0】nginx服务器配置接口站点进行wss转发ws,重启php+nginx:
    server
    {
      location /wss {
        proxy_pass http://127.0.0.1:8282;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Real-IP $remote_addr;
      }
    }

  3. 【任务1】 Linux下composer安装gatewayclient和gateway-worker
    1)宝塔中安装php8 + php8专用的swoole4、fileinfo、redis
    2)cd到后台根目录,使用指定php版本执行composer安装以上依赖
  4. 【任务2】部署GatewayWorker启动器到tp项目
  5. 【任务3】部署GatewayWorker逻辑处理器到tp项目
  6. 【任务4】手动启动worker监听服务
  7. 【任务5】前端连接,开始聊天

启动wss服务 / 停止wss服务

Linux环境

启动方法
 

cd /path/of/project/
/www/server/php/80/bin/php  start.php start -d

停止方法

cd /path/of/project/
/www/server/php/80/bin/php  start.php stop

Windows环境

启动方法

双击打开start_for_win.bat

停止方法

切换到以上窗口,Ctrl+C,会问y/n,输入y回车即可;

没反应的话,按多几次

其他问题

怎么修改wss端口?
修改\app\worker\start_gateway.php的“gateway 进程” + nginx转发地址端口号

连接顺序示例

  1. 前端指定wss服务器地址 wss://xx.com/wss  
  2. 前端连接wss服务器
    this.wss = uni.connectSocket({
    	url: this.wss_url,
    	success: () => {
    		console.log('>> wssStore() > connect() > success()')
    	},
    	fail: (e) => {
    		console.log('>> wssStore() > connect() > fail()')
    		console.log('>> ', JSON.stringify(e))
    	},
    	complete: ()=> {
    		console.log('>> wssStore() > connect() > complete()')
    	}
    })

  3. 前端连接wss成功后,触发后台\app\worker\Events.php::onConnect($client_id)
    这时后台应该考虑通过gateway通知此终端(前端)进行init操作
    // 初次连接 - 初始化命令
    clog('>> 初始化命令 > 开始通知');
    Gateway::sendToClient($client_id, json_encode(array(
        'type'      => 'init',
        'client_id' => $client_id
    )));
    clog('>> 初始化命令 > 完成通知');

  4. 前端收到wss来信,命令=init,这时应该向tp后台接口回信,提交当前用户ID+wss分配的终端ID进行绑定:
    // 记录终端id
    this.client_id = message.client_id || null
    
    // 通知后台uid + client_id绑定
    let bInfo = {
    	user_id: this.user_id,
    	client_id: this.client_id
    }
    let bindOK = await request.post({ url: '后台绑定接口', data: bInfo })
    
    // 绑定成功
    if (bindOK) {
      this.isBind = true
      // 通知服务器 发送当前用户的 离线未拉取信息
      this.let_server_send_my_un_downloaded_message()
    } else {
      // 绑定失败
      this.isBind = false
    }
    

  5. TP后台收到前端通知,在gateway层面绑定当前终端与当前用户,并通知好友关于此人的上线状态,并更新用户的登录记录
    /**
     * 绑定用户ID和终端ID
     */
    public static function userBinding ($user_id, $client_id) {
        // 如果当前ID在线,将其他地方登陆挤兑下线
        if(Gateway::isUidOnline($user_id)){
            // 通过gateway向已连接的指定终端推送指令 - 命令其下线
            wsSendMsg($user_id,'offline',['id'=>$user_id,'client_id'=>$client_id]);
        }
    
        // 绑定人+设备
        Gateway::bindUid($client_id, $user_id);
        
        // 更新登录信息
    
        // 获取好友
        $friends = self::get_friends_uids_by_user_id($user_id);
        
        // 通知好友,有人上线了
        foreach ($friends as $oneUid) {
            wsSendMsg($oneUid,'isOnline',['id'=>$user_id,'is_online'=>1]);
        }
    }

  6. 前端A发信息给B
    1)A把信息发给后台接口(不是直接通过wss发信),指明发给B
    2)后台写入数据库,判断B是否在线
    在线)通过gateway给B发信
    离线)无动作...
  7. 前端B接收发信息给A:如上,A在线的话就收到gateway发来的信息,不在线就下次上线再一起收信(未读)
  8. 前端不想聊了,分两步操作:
    1)主动通知后台“我要下线”,后台可以更新下线时间,再找出此人的好友列表,并通知大家此人已下线;
    // 获取好友,逐一通知
    $friends = self::get_friends_uids_by_user_id($user_id);
    foreach ($friends as $oneUid) {
        // 通过uid去发信,不管在不在线
        wsSendMsg($oneUid, 'isOffline', ['id'=>$user_id, 'is_online'=>0]);
    }

    2)关闭wss连接,触发后台\app\worker\Events.php::onClose($client_id),这时后台可以考虑通过gateway释放此终端的占用资源:Gateway::closeClient($client_id)
  9. 核心业务已完成

【任务1】 Linux下composer安装gatewayclientgateway-worker

参考

laravel+workerman/gateway-worker 从安装到运行

https://blog.csdn.net/Dong_Alex/article/details/105902207

本地开发路径

/home/king/tmp/top-backend/server

目标命令,先不执行:

composer require workerman/gatewayclient

composer require workerman/gateway-worker

直接运行报错信息:

[king@localhost server]$ composer require workerman/gatewayclient

./composer.json has been updated

Running composer update workerman/gatewayclient

Loading composer repositories with package information

Updating dependencies

Your requirements could not be resolved to an installable set of packages.

  Problem 1

    - Root composer.json requires php >=8.0 but your php version (7.3.31) does not satisfy that requirement.

  Problem 2

    - overtrue/wechat is locked to version 5.7.1 and an update of this package was not requested.

    - overtrue/wechat 5.7.1 requires php >=7.4 -> your php version (7.3.31) does not satisfy that requirement.

  Problem 3

    - topthink/think-swoole is locked to version v3.1.3 and an update of this package was not requested.

    - topthink/think-swoole v3.1.3 requires ext-swoole >=4.4.8 -> it is missing from your system. Install or enable PHP's swoole extension.

To enable extensions, verify that they are enabled in your .ini files:

    - /www/

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

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

相关文章

图文并茂的帮助文档你值得拥有

概述 工作中除了写代码开发需求,也需要写文档,怎么写好一个文档能够让读者既能看懂API,又能快速上述操作,所见即所得。本文基于vitepress、ace-builds带大家实现一个这样好用的帮助文档。 实现效果 在线预览地址:ht…

4.5 数据加密

思维导图: 4.5 数据加密 为确保高度敏感数据的安全性,如财务、军事及国家机密数据,可采用数据加密技术。此技术将原始数据(明文)转化为不可识别格式(密文),确保不知解密方法的人无法…

提高车联远控异常分析效率的设想

提高车联远控异常分析效率的设想 前言 随着汽车集成度、智能化、软件功能越来越丰富,用户车辆使用已不是传统的出行、驾驶等物理场景,更多的人与车的互动功能的场景。其中车联远控功能使用日益增多。技术人员开展排查车联远控问题时,往往需…

图解kd树+Python实现

开篇 在讲解k-近邻算法的时候,我们提供的思路是:对于新到来的样本,计算该样本与训练集中所有样本之间的距离,选取训练集中距离新样本最近的k个样本中大多数样本的类别作为新的样本的类别。 也就是说,每次都要计算新的样…

c语言基础:L1-060 心理阴影面积

这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。 现给…

4.6 其他安全性保护

思维导图: 4.6 其他安全性保护 1. 推理控制 (Inference Control) 定义:处理强制存取控制未解决的问题,如利用列的函数依赖关系,从低安全等级信息推导出高安全等级信息。示例:在公司信息系统中,姓名和职务为…

SQL查询优化---如何查询截取分析

慢查询日志 1、慢查询日志是什么 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。 具体指运行时间超过long_query_time值的…

use renv with this project create a git repository

目录 1-create a git repository 2-Use renv with this project 今天在使用Rstudio过程中,发现有下面两个新选项(1)create a git repository (2) Use renv with this project. 选中这两个选项后,创建新项目,在项目目…

Redis(01)| 数据结构

这里写自定义目录标题 Redis 速度快的原因除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。 因此,这次我…

此页面不能正确地重定向

这种是由于条件判断有误,程序不断的重定向到一个页面,而造成的死循环的情况 下面列举一个常出现的场景之一 1、使用过滤器实现登录验证错误处理 解释:当用户访问login.jsp进行登录的时候,这个时候请求会被Filter捕获&#xff0…

【Java基础(高级篇)】集合源码剖析

集合源码剖析 文章目录 集合源码剖析1. List接口分析1.1 ArrayList1.2 LinkedList 2. Map接口分析2.1 哈希表的物理结构2.2 HashMap中数据添加过程2.2.1 JDK7中过程分析2.2.2 JDK8中过程分析 2.3 红黑树2.4 HashMap源码剖析(JDK1.8.0_271)2.4.1 Node2.4.2 属性2.4.3 构造器2.4.…

基础课11——数据来源

随着科技的进步和数字化转型的加速,全球数据量正以惊人的速度增长。根据IDC的最新报告,2020年全球数据总量已经达到了约53 ZB(Zettabyte,万亿亿GB),而这个数字在2025年预计会达到175 ZB。这种指数级增长不仅…

MAC下安装Python

MAC基本信息: 执行命令: brew install cmake protobuf rust python3.10 git wget 遇到以下问题: > Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/rust-1.59.0 Already downloaded: /Users/xxxx/Library/Caches/Ho…

售后处置跟踪系统设想

售后处置跟踪系统设想 前言 随着汽车工业的发展,软件定义车的模式已成为主流汽车设计及智能化功能架构模式,通过引入SOA的软件架构设计,使得现有的座舱软件、云端服务软件、App软件等众多功能模块的版本迭代频次日新月异,发版更…

【ubuntu】 Linux(ubuntu)创建python的虚拟环境

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

语雀故障事件——P0级别事故启示录 发生肾么事了? 怎么回事?

前言 最近,阿里系的语雀出了一个大瓜,知名在线文档编辑与协同工具语雀发生故障,崩溃近10小时。。。。最后,官方发布了一则公告,我们一起来看看这篇公告,能不能有所启发。 目录 前言引出一、语雀P0故障回顾…

设计模式(19)命令模式

一、介绍: 1、定义:命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。 2、组…

4+非肿瘤纯生信。氧化应激+WGCNA+药物预测筛序关键基因

今天给同学们分享一篇非肿瘤氧化应激WGCNA的生信文章“Identification of oxidative stress-related biomarkers associated with the development of acute-on-chronic liver failure using bioinformatics”,这篇文章于2023年10月10日发表在Scientific Reports期刊…

双十一什么东西一定要买?实用性强好物千万不能错过

一年一度的双十一购物节即将来临啦!相信很多朋友都在等这个时间选购一些实用性比较强好物,平时太贵的一些家电都舍不得买,就是为了等到双十一这一些,准备买买买的朋友们,别着急,作为智能家电好物分享家的我…