workerman怎么实现分组群聊

workerman怎么实现分组群聊

一、基础

1. workerman

workerman是国人开发的良心高性能的PHP socket 服务器框架,在全球最大同性交友平台gayHub的star都4K多,可以想象是多么的牛X。

可以单独部署,也可以整合进MVC的框架(TP,laravel等),可以说非常实用,并发效果也好。

官网地址:

http://www.workerman.net/workerman

gayhub地址:

https://github.com/walkor/workerman/

2. gateway-worker

gateway-worker(后面直接称gateway)是基于 workerman开发的TCP长连接框架,用于快速开发TCP长连接应用。

在线聊天一般都是实用长连接保持通信,使用 workerman虽然能够做到同样的效果,但是gateway更加的方便快捷。

(轮询构建的聊天室已经OUT了,实在是太…)

gayhub地址:

https://github.com/walkor/GatewayWorker

3. gatewayClient

gateClient是用来辅助 workerman或者是gateway进行用户分组以及向用户发送信息的组件,同时,能够快速便捷的将原有系统的uid和clientid绑定起来。

gayhub地址:

https://github.com/walkor/GatewayClient

二、理论:

1. 与MVC系统整合的原则:

·现有mvc框架项目与GatewayWorker独立部署互不干扰;

·所有的业务逻辑都由网站页面post/get到mvc框架中完成;

·GatewayWorker不接受客户端发来的数据,即GatewayWorker不处理任何业务逻辑,GatewayWorker仅仅当做一个单向的推送通道;

·仅当mvc框架需要向浏览器主动推送数据时才在mvc框架中调用Gateway的API(GatewayClient)完成推送。

2. 实现步骤:

(1)网站页面建立与GatewayWorker的websocket连接;

(2)GatewayWorker发现有页面发起连接时,将对应连接的client_id发给网站页面;

(3)网站页面收到client_id后触发一个ajax请求(假设是bind.php)将client_id发到mvc后端;

(4)mvc后端bind.php收到client_id后利用GatewayClient调用Gateway::bindUid($client_id, $uid)将client_id与当前uid(用户id或者客户端唯一标识)绑定。如果有群组、群发功能,也可以利用Gateway::joinGroup($client_id, $group_id)将client_id加入到对应分组;

(5)页面发起的所有请求都直接post/get到mvc框架统一处理,包括发送消息;

(6)mvc框架处理业务过程中需要向某个uid或者某个群组发送数据时,直接调用GatewayClient的接口Gateway::sendToUid Gateway::sendToGroup 等发送即可。

三、实现—配置和开启Gateway:

1.下载和使用gateway

可以单独使用,也可以放在框架的public目录下。

2.编辑start.php

·start.php是需要使用php命令行运行的。

·注意require_once的路径

ini_set('display_errors', 'on');use WorkermanWorker;if(strpos(strtolower(PHP_OS), 'win') === 0){    exit("start.php not support windows, please use start_for_win.batn");}// 检查扩展if(!extension_loaded('pcntl')){    exit("Please install pcntl extension.See http://doc3.workerman.net/appendices/install-extension.htmln");}if(!extension_loaded('posix')){    exit("Please install posix extension.See http://doc3.workerman.net/appendices/install-extension.htmln");}// 标记是全局启动define('GLOBAL_START', 1);// 注意这里的路径require_once '../vendor/autoload.php';// 加载所有Applications/*/start.php,以便启动所有服务foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file){    require_once $start_file;}// 运行所有服务Worker::runAll();

3. start_gateway.php

·在ApplicationsYourAppstart_gateway.php中可以编辑

// 部分文件内容//将$gateway改成websocket协议,demo中是text协议$gateway = new Gateway("websocket://0.0.0.0:8282");

4.start_register.php

·需要注意start_register.php 中$register必须是text协议,同时需要注意端口

// register 服务必须是text协议$register = new Register('text://192.168.124.125:1238');

5. 配置好后,开启start.php

$ php start.php start

四、实现-服务端开发

上面提到了,用户只有在触发连接的时候才经过gateway的onConnect($client_id),而所有的业务操作都应该在web系统中实现。

因此我创建了一个GatewatServer.php的controller,负责处理这些业务

post('room')));        $clientId=trimAll($request->post('client_id'));        // 接受到上面的三个参数,进行分组操作        Gateway::$registerAddress = '192.168.124.125:1238';        // client_id与uid绑定        // Gateway::bindUid($clientId, $userGuid);        // 加入某个群组(可调用多次加入多个群组) 将clientid加入roomid分组中        Gateway::joinGroup($clientId, $roomId);        // 返回ajax json信息        $dataArr=[            'code'=>$userGuid,            'status'=>true,            'message'=>'Group Success'        ];        return json()->data($dataArr);    }    // 接受用户的信息 并且发送    public function send(Request $request){        Gateway::$registerAddress = '192.168.124.125:1238';        // 获得数据        $userGuid=Session::get('loginuser');        $roomId=intval(trimAll($request->post('room')));        $message=trim($request->post('message'));        // 获得用户的称呼        $userInfo=Cache::get($userGuid);        // 将用户的昵称以及用户的message进行拼接        $nickname=$userInfo['nickname'];        $message=$nickname." : ".$message;        // 发送信息应当发送json数据,同时应该返回发送的用户的guid,用于客户端进行判断使用        $dataArr=json_encode(array(            'message' => $message,            'user'=>$userGuid        ));        // 向roomId的分组发送数据        Gateway::sendToGroup($roomId,$dataArr);    }}

五、实现-客户端连接与发送/接收:

开启了gateway之后,就可以监听并且等待浏览器接入了。

客户端这里使用js监听websocket:

1. 用于处理客户端连接websocket以及接收消息

// 这个示例和gateway官网的示例是一样的    // 监听端口    ws = new WebSocket("ws://192.168.124.125:8282");    // 绑定分组的ajaxURL    var ajaxUrl="{:url('/gateway/bind')}";    // 发送消息的ajaxURL    var ajaxMsgUrl="{:url('/gateway/send')}";    // 通过房间号进行分组    var roomId="{$roomInfo.guid}";    // 获取当前登录用户的guid,用于标识是自己发送的信息    var loginUser="{$userLoginInfo.guid}";    // 获取当前房间号的主播的uid,用于标识是主播发送的信息    var roomUser="{$roomInfo.uid}";    // 服务端主动推送消息时会触发这里的onmessage    ws.onmessage = function(e){        // console.log(e.data);        // json数据转换成js对象        var data = eval("("+e.data+")");        var type = data.type || '';        switch(type){            // Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定            case 'init':                // 利用jquery发起ajax请求,将client_id发给后端进行uid绑定                $.post(ajaxUrl, {client_id: data.client_id,room:roomId}, function(data){                    // console.log(data);                }, 'json');                break;            // 当mvc框架调用GatewayClient发消息时直接alert出来            default :                // 如果登陆用户的guid和数据发送者的guid一样,则使用不同的颜色(只能自己看到)                if(loginUser == data.user){                    addMsgToHtml(data.message,'#F37B1D');                    break;                // 如果发送者的guid和主播uid一样,则对所有的显示都增加一个[主播标识]                }else if(data.user==roomUser){                    addMsgToHtml("[主播] "+data.message,'#0e90d2');                    break;                }else{                // 其他的就正常发送消息                    addMsgToHtml(data.message,'#333');                }                break;        }    };

2. 用于将接收到的消息添加到div中进行显示

// 向面板中增加新接收到的消息    // 其中message是消息,color是显示的颜色,主要为了区分主播以及自己发送的消息和系统提示    function addMsgToHtml(message,color) {        if(message.length==0){            return false;        }        // 获取html,并且增加html        var obj=$("#room-viedo-chat");        var html=obj.html();        //         html+='

'+message+'

'; obj.html(html); // 将滚动条滚动到底部 obj.scrollTop(obj[0].scrollHeight); }

3.用于发送消息

// 发送聊天消息    function sendMsg(){        // 去掉onclick属性,使得3秒之内无法发送信息        $("#sendMsgBox").attr('onclick','');        var btnObj=$("#sendMsgBtn");        var tmpNum=3;        var tmpMsg=tmpNum+' S';        btnObj.text(tmpMsg);        var int =setInterval(function () {            // 3秒之内不能发送信息,3秒之后,回复onclick属性以及文字            if(tmpNum==0){                tmpMsg="发送";                clearInterval(int);                btnObj.text("发送");                $("#sendMsgBox").attr('onclick','sendMsg()');            }            btnObj.text(tmpMsg);            tmpNum-=1;            tmpMsg=tmpNum+' S';        },1000);        var message=$("#chattext").val().trim();        var obj=$("#room-viedo-chat");        var html=obj.html();        if(message.length>=140){            // 获取html,并且增加html            addMsgToHtml("系统提示: 不能超过140个字符","#8b0000");            return false;        }        if(message.length==0){            // 获取html,并且增加html            addMsgToHtml("系统提示: 不能发送空消息","#8b0000");            return false;        }        // 向server端发送ajax请求        $.post(ajaxMsgUrl,{room:roomId,message:message},function (data) {        },'json');        return false;    }

4.一点儿html代码

    
发送

六、效果:

效果很明显:

·系统提示是单独的颜色

·本人发布的,是自己能够分辨的橙色

·主播发布的是蓝色,同时前面有[主播]标识

·看其他人发布的就是普通的颜色

1576113301681338.png

PHP中文网,有大量免费的workerman入门教程,欢迎大家学习!

以上就是workerman怎么实现分组群聊的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/101012.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
抖音收藏视频突然消失 抖音收藏恢复教程
上一篇 2025年11月21日 02:18:15
【Linux】用户和权限及实用操作——迅速了解用户和权限及其实用操作
下一篇 2025年11月21日 02:20:17

相关推荐

  • 俄罗斯Яндекс账号登录入口 Yandex电脑版官方网站登录

    答案是https://www.yandex.com/。该网站提供搜索、地图、新闻、翻译等服务,界面简洁,支持个性化设置与账户同步,并拥有邮箱、云存储及丰富的应用生态。 1、立即进入“☞☞☞☞点击俄罗斯yandex搜索引擎入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击快速获取Yandex免登录官网链接☜…

    2026年9月21日
    000
  • Xdebug性能优化:解决PHP调试器导致页面加载缓慢或超时的问题

    当Xdebug配置不当,即使未主动调试,也可能导致PHP应用页面加载缓慢或超时。本文将深入探讨Xdebug的工作原理,指导如何通过正确配置xdebug.mode、排查多配置文件冲突,并利用Xdebug日志进行诊断,从而有效解决调试器造成的性能瓶颈,确保开发环境的流畅运行。 理解Xdebug的连接机制…

    2026年9月21日
    000
  • Microsoft Teams如何使用快捷键 Microsoft Teams操作效率的提升秘籍

    答案:掌握Microsoft Teams快捷键可提升操作效率。依次介绍聊天窗口、视图切换、通话控制、静音、摄像头、屏幕共享、快速参会、结束会议、消息状态、搜索、换行、命令面板、自定义设置、Tab导航、表情符号及字体调整等快捷操作。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用…

    2026年9月21日
    000
  • 谷歌浏览器官方主站入口 最新Chrome在线登录页面

    谷歌浏览器官方主站入口是https://www.google.com,该页面具备界面简洁、操作流畅、集成化服务入口和个性化推荐等特点,支持多设备访问且无广告干扰。 谷歌浏览器官方主站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌浏览器最新Chrome在线登录页面相关信息,感兴趣的…

    2026年9月21日
    000
  • MySQL 大型历史数据表结构设计与优化指南

    本文旨在为处理大量客户历史交易数据的MySQL数据库设计提供专业指导。我们将探讨如何构建高效、可扩展的表结构,重点关注主键设计、数据分区、实时数据摄入以及性能优化策略,以确保系统能够稳定支持百万级乃至亿级数据量的查询需求。 MySQL大型历史数据表结构设计与优化 在处理大量历史数据,特别是涉及到多用…

    2026年9月21日
    000
  • Xdebug配置与故障排除:解决PHP调试连接导致的网页超时问题

    本文旨在解决Xdebug在IDE未监听调试连接时可能导致的网页加载缓慢或超时问题。我们将深入探讨Xdebug的工作原理、关键配置参数,并提供一套系统的故障排除方法,包括如何启用详细日志记录以及检查多重配置文件的影响,以确保Xdebug仅在需要时激活,避免不必要的性能开销。 1. 理解Xdebug的工…

    2026年9月21日
    100
  • PHP面向对象编程:解决父类构造器传递值在子对象方法中为空的问题

    本文探讨了PHP中一个常见的面向对象编程问题:当父类构造器接收并初始化一个子对象时,如何确保该子对象内部的方法能正确访问到父类传递的值,避免出现null。文章将通过示例代码,详细介绍两种核心解决方案:通过控制器提供内部对象的访问器(Getter),以及采用依赖注入(Dependency Inject…

    2026年9月21日
    400
  • 构建与调试PHP简易路由系统:从原理到实践

    本文将指导您如何从零开始构建一个基础的PHP路由系统,实现URL到控制器和方法的映射。我们将深入探讨$_SERVER[‘REQUEST_URI’]的解析、控制器文件的动态加载、方法调用以及如何通过.htaccess进行URL重写。同时,文章还将详细讲解常见的“未定义变量”错误…

    2026年9月21日
    200
  • PHP框架中间件有什么用处_PHP框架中间件设计与实现

    PHP框架中间件是处理请求和响应的过滤器,用于实现身份验证、日志记录、CORS等通用逻辑,核心价值在于解耦和提升可维护性。通过定义中间件接口、具体中间件类及管道调度器可实现自定义中间件,如身份验证或CORS处理。在Laravel中可通过Kernel.php配置全局、分组或路由级中间件,执行顺序按注册…

    2026年9月21日
    100
  • deepseek下载速度优化_从deepseek下载速度优化官网获取

    deepseek下载速度优化入口在官网https://www.deepseek.com,进入后可通过设置调整响应模式、使用智能路由和数据压缩技术提升速度。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ deepseek下载速度优化入口地址在…

    2026年9月21日
    100
  • Laravel中的CSRF保护原理和实现

    laravel通过在表单中嵌入唯一的token来实现csrf保护,确保请求来自应用程序。1)用户登录后生成并存储token于会话中。2)表单提交时,laravel检查token是否匹配,若不匹配则拒绝请求。 在Laravel中,CSRF(跨站请求伪造)保护是一个关键的安全功能,那么它是如何工作的呢?…

    2026年9月21日
    100
  • 蛙漫漫画在线看 蛙漫漫画官网正版免费入口

    蛙漫漫画官网正版免费入口为https://www.waman.vip,该平台提供海量高清漫画资源,涵盖奇幻、恋爱、悬疑等多种题材,支持横屏、竖屏、滚动等阅读模式,并具备夜间模式、字体调整等优化功能,同时拥有弹幕互动、智能推荐、追更提醒等个性化服务,确保用户获得流畅舒适的阅读体验。 蛙漫漫画在线看 蛙…

    2026年9月21日
    100
  • .com网站安全维护_保障.com网站稳定的措施

    答案:保障.com网站稳定需加强安全防护、定期备份、实时监控和应急准备。部署防火墙、更新系统、使用HTTPS、限制端口;制定自动备份并异地存储,定期恢复测试;利用监控工具检测可用性与异常流量,优化加载速度;建立应急流程,严格权限管理,定期演练。细节执行到位才能确保长期安全稳定运行。 确保.com网站…

    2026年9月21日
    200
  • PHP 数组值比较与嵌套数组过滤教程

    本教程详细讲解如何在 PHP 中比较一个简单数组与一个复杂嵌套数组,并根据特定条件(如文件名匹配)过滤嵌套数组中的所有相关子数组。我们将通过识别非匹配项的索引,然后从所有子数组中移除这些项并重新索引,实现精确的数据筛选。 问题背景 在 php 开发中,我们经常会遇到需要处理结构复杂的数组数据。例如,…

    2026年9月21日
    200
  • 漫番漫画官方网页_ 漫番漫画在线访问入口

    漫番漫画官方网页入口为https://manwa.me,该平台汇聚多类型漫画资源,界面简洁、更新稳定,支持网页端流畅阅读;采用动态域名与镜像站点保障访问连续性,配备HTTPS加密提升安全性;提供个性化阅读设置、书架收藏及评论互动功能,优化用户体验。 漫番漫画官方网页入口地址在哪里?这是不少网友都关注…

    2026年9月21日
    300
  • Laravel中的事件和监听器:解耦和优化应用程序交互

    Laravel中的事件和监听器:解耦和优化应用程序交互 引言:在开发应用程序时,我们经常会面临需要实现模块之间的通信和协作的情况。传统的方法是直接在代码中调用其他模块的方法或者通过回调函数进行通信。然而,这种紧密耦合的设计方式会导致代码的复杂性和维护性的下降。为了解决这个问题,Laravel框架提供…

    2026年9月21日
    000
  • PHP错误日志怎么查看_PHP错误日志定位与查看方法

    要查看PHP错误日志,首先确定php.ini中error_log路径,若未设置则检查Web服务器(如Apache/Nginx)错误日志;确保log_errors=On、error_reporting合理配置,并通过tail、grep等工具分析日志,结合框架日志和系统日志(如syslog)全面定位问题…

    2026年9月21日
    300
  • PHP PDO lastInsertId() 返回 0 的原因与解决方案

    在使用 PHP PDO 的 lastInsertId() 方法时,如果意外返回 0,通常是因为在执行 INSERT 语句后,又创建了一个新的数据库连接实例来调用 lastInsertId()。lastInsertId() 依赖于在同一数据库会话中获取最后插入的自增 ID。本文将深入解析此问题,并提供…

    2026年9月21日
    500
  • Laravel中的Blade模板引擎基础用法

    blade模板引擎在laravel中用于简化视图开发。具体使用方法如下:1.输出变量:{{ $variable }}。2.条件判断:@if、@else、@elseif。3.循环:@foreach。4.模板继承:@extends、@section、@yield。blade让视图代码更简洁易读,但需注意…

    2026年9月21日
    200
  • mysql如何实现后台管理系统

    答案:基于MySQL的%ignore_a_1%需设计用户、权限、日志等表结构,通过后端语言实现安全的CRUD接口与JWT认证,前端展示数据并控制权限,确保系统安全稳定。 实现一个基于 MySQL 的后台管理系统,核心是构建一个安全、稳定、可扩展的系统架构,将数据库作为数据存储层,配合后端语言和前端界…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信