当前位置:首页  >  行业资讯  > 正文

当前动态:Swoole - webSocket消息服务系统代码设计篇

当前动态:Swoole - webSocket消息服务系统代码设计篇
2023-03-04 13:06:33 来源:腾讯云

概述

已经Swoole系列的第二篇知识点了,前一篇主要的针对处理的是方案设计,这一篇主要是代码实现的内容,主要介绍高性能的原因已经实现,编程框架使用EasySwoole。


(资料图)

Swoole 与 EasySwoole

Swoole属于php中的一个超级扩展,它会接管PHP的进程,管理和分配worker,但他依赖 PHP-Cli模式。Swoole和Yaf有相似的地方,它们都是以守护进程的模式、常驻内存的方式达到提高处理性能。

Swoole内置了TCP、UDP、WebSocket、协程、异步、Redis/Mysql链接池等高效开发手段和方法,当然对于新模式也有新的挑战,比如swoole不能使用die,会致使worker滑落,协程使用后要注意使用回调的过程,如果对php的基础知识不了解的同学,可以翻看我之前的php博客里的总结,这里就不过多叙述了。

EasySwoole是一款非常简单上手易操作的Swoole框架,上线2年多以来经得住生产环境的考验,官网文档写的也很详细,还有专门解答的QQ群,大佬们会解答很多问题。

安装EasySwoole框架

之前我使用composer进行安装的(composer是php中管理依赖包的工具,和node里面的npm,python的pip 一样),现在都使用docker镜像直接操作了。

docker pull easyswoole/easyswoole3docker run -ti -p 9501:9501 -p 80:80 --name easyswoole easyswoole/easyswoole3 

项目目录结构:

.├── App│ ├── Conf│ ├── Crontab│ ├── HttpController│ │ ├── Api│ │ └── Router.php│ ├── Log│ │ └── LogHandel.php│ ├── Models│ │ ├── ImChatModel.php│ │ ├── ImModel.php│ │ └── PushMsgModel.php│ ├── Parser│ │ └── WebSocketParser.php│ ├── Server│ │ ├── ChangPeiServer│ │ ├── MysqlServer│ │ ├── RedisServer│ │ ├── Server.php│ │ └── WebSocketServer│ ├── Utility│ │ ├── Http│ │ ├── Mall│ │ └── Ws│ ├── WebSocketController│ │ ├── Base.php│ │ ├── Error│ │ ├── V1│ ├── WebSocketEvent.php│ └── WebSocketRoute│     └── ForwardRoute.php├── EasySwooleEvent.php├── Log│ └── swoole.log

注册服务 与启动加载

1.在EasySwooleEvent.php文件中加载初始化需要的Mysql、redis配置文件,所有需要的服务都需要在启动文件中进行注册,才能使用。

public static function loadConf(){    $ConfPath = EASYSWOOLE_ROOT . "/App/Conf/";    $Conf  = Config::getInstance();    $files = File::scanDirectory($ConfPath);    if (!is_array($files["files"])) {        return;    }    foreach ($files["files"] as $file) {        $data = require_once $file;        $Conf->setConf(strtolower(basename($file, ".php")), (array)$data);    }}

2.注册Mysql连接池,Mysql连接池主要设置参数,

 [        "host" => "59.110.162.133",        "port" => "3306",        "database" => "swoole_msg", //cpwxw2_db_v2        "username" => "work",        "password" => "cp2018csq123456",        "timeout" => 300,        "charset" => "utf8mb4"    ],    //Mysql连接池配置    "conn_pool" => [        "timeOut" => "3.0",    //设置获取连接池对象超时时间        "checkOut" => 30 * 1000,  //设置检测连接存活执行回收和创建的周期        "maxidleTime" => 15,       //连接池对象最大闲置时间(秒)        "maxObjectNumber" => 100,       //设置最大连接池存在连接对象数量        "minObjectNumber" => 5,        //设置最小连接池存在连接对象数量        "autoPing" => 5,        //设置自动ping客户端链接的间隔    ],];

3.注册redis链接池

use \EasySwoole\Redis\Config\RedisConfig;use \EasySwoole\RedisPool\RedisPool;$redisConf = GlobalConfig::getInstance()->getConf("redis");RedisPool::getInstance()->register(new RedisConfig($redisConf),"redis");

4.注册自定义log

use  \EasySwoole\EasySwoole\Logger;Logger::getInstance(new \App\Log\LogHandel());

5.我的项目里还使用了crontab模块

use Swoole\Coroutine\Scheduler;use EasySwoole\EasySwoole\Crontab\Crontab;//用户通知队列Crontab::getInstance()->addTask(\App\Crontab\PushUserNoticeMsg::class);

6.添加热启动

Swoole的服务属于常驻内存加载类型的服务,所以每次修改代码后都需要重启服务,所以为了方便,添加了热加载目录,热加载原理就是当检测到指定目录有代码更新时,用传递信号的方式进行,指挥进程进行重新加载。

$hotReloadOptions = new \EasySwoole\HotReload\HotReloadOptions;$hotReload = new \EasySwoole\HotReload\HotReload($hotReloadOptions);$hotReloadOptions->setMonitorFolder([EASYSWOOLE_ROOT . "/App"]);$server = ServerManager::getInstance()->getSwooleServer();$hotReload->attachToServer($server);

7.启动/停止服务,参数说明

-mode 说明启动服务类型

-d 以守护进程的方式

php easyswoole server start -mode=websocket -dphp easyswoole server stop 

异步和 DB(Redis/Mysql)使用

1.高性能的异步操作

如果是不依赖于结果的计算,异步操作提高性能的有效手段之一,异步操作不需要等待结果,更好的利用CPU和I/O传输。

use EasySwoole\EasySwoole\Task\TaskManager;TaskManager::getInstance()->async(function () use ($tableName,$data) {    // todo code ...});

2.Redis/Mysql使用

在高并发情况下,资源浪费的占用时间越短越好,可以提高程序的服务效率。在ORM默认情况下是使用defer方法获取pool内的连接资源,并在协程退出时自动归还,在此情况下,在带来便利的同时,会造成不必要资源的浪费。

我们可以使用invoke方式,让ORM查询结束后马上归还资源,可以提高资源的利用率。

Mysql的使用Demo.

DbManager::getInstance()->invoke(function (ClientInterface $client)use ($where, $tableName, $count) {    $pushMsgModel = PushMsgModel::invoke($client);    $pushMsgObj = $pushMsgModel->tableName($tableName)        ->field(["push_id"])        ->get($where);}, self::MYSQL_CONN_NAME);

Redis的使用Demo.

## invoke方式public function setAuthorFd(int $uid, int $fd){    RedisPool::invoke(function (Redis $redis) use ($fd, $uid) {        $sRet = $redis->zAdd(self::PUSH_MSG_AUTHOR_NOTICE_SYSTEM, $uid, $fd);    }, self::REDIS_CONN_NAME);}## defer方式$redis = \EasySwoole\RedisPool\RedisPool::defer("redis");$data = $redis->lRange(self::PUSH_MSG_COMMENT_DELAY_LISTS, 0, 1000);

WebSocket服务

1.WebSocket协议是什么

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

在没有WebSocket协议之前,在网页中,实现一个聊天室只能使用ajax 不断轮询,请求服务器是否有数据产生,而这样的实现方法会出现一系列的问题:

如果轮询时间间隔太短,会导致客户端和服务端在一个时间段内不断的进行http tcp的握手/挥手动作和http 请求头,响应头的传输,大量消耗服务器资源,如果用户量大的情况,会造成服务器的繁忙以至于宕机客户端每次只能通过发送http 请求获得服务器是否有数据返回,且数据的及时性无法保证

正因为在这种情况下,所以WebSocket出现了,它只需要一次http握手,就可以保持一个长连接,使得服务器可以主动发送消息给客户端,大大减少了轮询机制的消耗。

2.WebSocket协议实现原理

在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为握手 。

在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:

Header: 互相沟通的Header是很小的-大概只有 2 BytesServer Push: 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。
//$fd,指的是系统里的文件描述符fduse EasySwoole\EasySwoole\ServerManager;$server = ServerManager::getInstance()->getSwooleServer();$server->push($fd,json_encode($messageData));//获取当前链接的详细信息$info = $server->getClientInfo($fd);//获取全部websocket中的链接fd//全员在线消息通知$server = ServerManager::getInstance()->getSwooleServer();$start_fd = 0;while(true){    $conn_list = $server->getClientList( $start_fd, $this->limit );    if ($conn_list===false || count($conn_list) === 0 || empty($conn_list))    {        break;    }    $start_fd = end($conn_list);    foreach ($conn_list as $fd){        $info = $server->getClientInfo($fd);        if ($info && $info["websocket_status"] === WEBSOCKET_STATUS_FRAME) {            $server->push($fd, json_encode($this->pushMsg));        }    }}

项目里主要使用的功能点已经讲解完毕了,剩下的等有时间再整理。

标签: Swoole 云数据库 Server

(责任编辑:news01)
当前动态:Swoole - webSocket消息服务系统代码设计篇

当前动态:Swoole - webSocket消息服务系统代码设计篇

已经Swoole系列的第二篇知识点了,前一篇主要的针对处理的是方案设计,这一篇主要是代码实现的内容,主...
03-04 13:06:33
每日头条!270W GAN充电器是一款微型电源砖可以同时为三台笔记本电脑充电

每日头条!270W GAN充电器是一款微型电源砖可以同时为三台笔记本电脑充电

这款小巧的GaN充电器以希腊雷电之神的名字命名为Zeus,可谓恰如其分,拥有世界上最小、功能最强大的充电...
03-04 11:38:40
时讯:苏志燮怎么念_苏志

时讯:苏志燮怎么念_苏志

1、苏志团,1970年4月,无党派人士,苏志团在人眼中是个诚信经营、与人为善的青年企业家。2、他领导的太...
03-04 10:48:01
【天天新视野】专家预测GDP增速目标设为5.5%左右 赤字率或适度上调

【天天新视野】专家预测GDP增速目标设为5.5%左右 赤字率或适度上调

全国两会召开在即,今年经济社会发展的主要预期目标将在政府工作报告中得以明确。作为疫情之后全力以赴...
03-02 16:07:01
【报资讯】数字pop字体怎么写_pop字体怎么写

【报资讯】数字pop字体怎么写_pop字体怎么写

1、1、一般标题字都采用较粗大的字体设计,用来书写标题字的笔,无论是平笔、圆笔或较粗实的POP广告笔,...
03-02 15:38:05
世界快资讯:青椒炒肉丝怎么做好吃_青椒炒肉丝做法

世界快资讯:青椒炒肉丝怎么做好吃_青椒炒肉丝做法

欢迎观看本篇文章,小升来为大家解答以上问题。青椒炒肉丝怎么做好吃,青椒炒肉丝做法很多人还不知道,...
03-02 11:18:35
每日消息!上海至嘉兴红色旅游列车恢复开行

每日消息!上海至嘉兴红色旅游列车恢复开行

3月1日,上海至嘉兴“南湖·1921”红色旅游列车恢复开行。据了解,Y701 Y702次红色旅游列车朝发夕返,每日在铁路
03-02 06:40:52
前沿资讯!鞠婧祎拼音怎么发音_鞠婧祎怎么读拼音

前沿资讯!鞠婧祎拼音怎么发音_鞠婧祎怎么读拼音

鞠婧祎拼音念jūjingyī,确实是有些难记而且还有点拗口的感觉,据网友爆料鞠婧祎的名字还是有由来的。...
03-02 04:29:05
信息:百度收录自动推送api接口最新修复版

信息:百度收录自动推送api接口最新修复版

原先百度官方提供的js代码已经失效了,无法使用,本文通过php文件制作接口推送,并通过前端静态调用推送
03-02 01:04:10
环球速读:美分析人士对话美前陆军军官:美军事人员已深度介入当前俄乌冲突

环球速读:美分析人士对话美前陆军军官:美军事人员已深度介入当前俄乌冲突

去年10月,曾有美国国防部高级官员证实,美国已经有军事人员进入乌克兰境内,对北约提供的武器进行监控...
03-01 21:56:51
【报资讯】持续增进民生福祉|高质量养老守护幸福“夕阳红”

【报资讯】持续增进民生福祉|高质量养老守护幸福“夕阳红”

东营日报社 爱东营讯近日,在广饶县广饶街道乐安居养老服务中心,理发师们正在给王金平老人理发。理发...
03-01 19:57:50
全球热推荐:任达华电影全集

全球热推荐:任达华电影全集

1、不是惊蛰,是《惊变》。2、《惊变》由邱礼涛执导的香港电影,由任达华、温碧霞等主演。3、任达华,195...
03-01 18:51:59
世界速读:2023上海申康医院发展中心招聘事业编怎么报名

世界速读:2023上海申康医院发展中心招聘事业编怎么报名

2023上海申康医院发展中心招聘工作人员招聘岗位及职数本次招聘岗位7个,是:办公室1名,医疗事业部2名,...
03-01 17:04:43
全球头条:恒盛能源(605580)3月1日主力资金净买入223.46万元

全球头条:恒盛能源(605580)3月1日主力资金净买入223.46万元

截至2023年3月1日收盘,恒盛能源(605580)报收于15 57元,上涨2 57%,换手率6 18%,成交量3 16万手,成交额4915 72万元。
03-01 15:49:28
世界热议:a型人格特征有哪些_a型人格

世界热议:a型人格特征有哪些_a型人格

1、A型血人对于生命的看法——完善人格的人生  A型血人一般属于内倾型,内心世界十分丰富,责任感强烈...
03-01 13:18:35
当前热讯:理文化工发布年度业绩 股东应占溢利11.57亿港元同比减少10.19%

当前热讯:理文化工发布年度业绩 股东应占溢利11.57亿港元同比减少10.19%

理文化工(00746)发布截至2022年12月31日止年度业绩,该集团取得收入总额58 67亿港元,同比增加13 13...
03-01 13:03:57
世界播报:内蒙古建筑职业技术学院2023单独考试招生简章

世界播报:内蒙古建筑职业技术学院2023单独考试招生简章

内蒙古建筑职业技术学院2023年单独考试招生简章网上填报志愿专业(一)网报志愿条件符合国家及自治区相关...
03-01 11:15:53
快讯:25股获高管增持 龙佰集团获增持金额最多

快讯:25股获高管增持 龙佰集团获增持金额最多

证券时报网讯,数据宝统计显示,近10个交易日(2月15日~2月28日)共有25家上市公司股份获高管增持。从增持...
03-01 09:27:49
当前时讯:硬盘启动盘制作工具是什么_硬盘启动盘制作工具

当前时讯:硬盘启动盘制作工具是什么_硬盘启动盘制作工具

1、编辑镜像用软碟通,把启动文件,万能驱动。2、系统镜像做好后,用它做成一个ios文件直接写入U盘即可...
03-01 07:47:23
天天微速讯:MWC 2023:tooz展示面向处方眼镜的AR显示方案

天天微速讯:MWC 2023:tooz展示面向处方眼镜的AR显示方案

2月28日消息,AR眼镜厂商tooz(蔡司和德国电信合资组建)在MWC2023期间,公布了一种轻量化AR眼镜方案,...
03-01 06:54:47
每日聚焦:硬刚苹果!小米13系列在欧洲发布,跟国内对比价格不便宜

每日聚焦:硬刚苹果!小米13系列在欧洲发布,跟国内对比价格不便宜

小米13系列距离国内发布会已经过去将近三个月,仍然受到了海外用户普遍欢迎。令人没想到的是,这一次欧...
03-01 01:57:13
动态焦点:新代表新委员新风采|全国人大代表周颖峰:生产一线磨匠魂

动态焦点:新代表新委员新风采|全国人大代表周颖峰:生产一线磨匠魂

03:09全国人大代表周颖峰是广西柳工机械股份有限公司的一名产业工人。入职13年来,周颖峰逐渐从一名普通...
02-28 22:25:25
环球播报:点缀的意思?_点缀的意思是什么呢

环球播报:点缀的意思?_点缀的意思是什么呢

1、1、正确,有画龙点睛之意。2、2、让事物加以装饰。3、相关关键词:点缀的意思4、以上就是【点缀的意...
02-28 22:16:12
环球聚焦:重庆限行违章怎么处理?

环球聚焦:重庆限行违章怎么处理?

一、如果闯禁,将受到什么处罚?违反错峰通行规定的,将通过电子抓拍和现场执法的方式,按照违反交通禁...
02-28 19:57:53
环球视讯!福建省国资委、厦门、泉州、漳州发布最新人事任免

环球视讯!福建省国资委、厦门、泉州、漳州发布最新人事任免

近日福建省国资委厦门、泉州、漳州发布一批人事任免来看详情——福建省国资委福建省人民政府国有资产监...
02-28 17:45:22
环球新动态:氢氧化钠溶解度曲线_氢氧化钠的溶解度

环球新动态:氢氧化钠溶解度曲线_氢氧化钠的溶解度

1、氢氧化钠在不同温度下的溶解度具体如下:2、1、温度(°C):0溶解度(g 100mL):423、2、温度(°C):
02-28 17:13:09
全球看热讯:小学一年级语文上册课本内容平平的家乡_小学一年级语文上册课本内容

全球看热讯:小学一年级语文上册课本内容平平的家乡_小学一年级语文上册课本内容

1、去百度文库,查看完整内容>内容来自用户:学而思网校识字一《一去二三里》课文原文一去二三里  一去...
02-28 15:48:44
当前消息!手机上百度登录账号不成功怎么办_手机上百度登录账号不成功怎么办呀

当前消息!手机上百度登录账号不成功怎么办_手机上百度登录账号不成功怎么办呀

1、在手机上登录百度账号,会发现无法登录,或者登录了也不显示。那么,这种情况我该怎么办呢?2、点击...
02-28 14:01:48
【天天速看料】为什么史湘云也被卖_史湘云结局为什么被卖

【天天速看料】为什么史湘云也被卖_史湘云结局为什么被卖

1、电视剧《红楼梦》给史湘云的结局惨不忍睹,史湘云沦为赔笑的船妓。由于《红楼梦》没有完成,因此史湘...
02-28 11:36:25
视讯!一图读懂上海市交通领域碳达峰实施方案

视讯!一图读懂上海市交通领域碳达峰实施方案

交通是落实碳达峰碳中和战略的重要领域之一,根据市委市政府总体工作部署,为有力有序有效做好交通领域...
02-28 11:46:29

精彩推送