Swoole webSocket消息服务系统代码设计详解

2024-03-05 0 3,021

目录

概述

已经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/easyswoole3
docker run -ti -p 9501:9501 -p 80:80
--name easyswoole easyswoole/easyswoole3

项目初始目录结构:
├── EasySwooleEvent.php
├── bootstrap.php
├── composer.json
├── composer.lock
├── dev.php
├── easyswoole
├── produce.php
└── vendor

注册服务 与启动加载

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连接池主要设置参数,
<?php
use EasySwoole\\ORM\\Db\\Config as DBConfig;
use EasySwoole\\ORM\\Db\\Connection;
use EasySwoole\\ORM\\DbManager;
return [
//mysql数据库配置
\'mysql-msg\' => [
\'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-&gt;setMonitorFolder([EASYSWOOLE_ROOT . \'/App\']);
$server = ServerManager::getInstance()-&gt;getSwooleServer();
$hotReload-&gt;attachToServer($server);

7.启动/停止服务,参数说明
-mode 说明启动服务类型 -d 以守护进程的方式
php easyswoole server start -mode=websocket -d
php easyswoole server stop

异步和 DB(Redis/Mysql)使用

1.高性能的异步操作
如果是不依赖于结果的计算,异步操作提高性能的有效手段之一,异步操作不需要等待结果,更好的利用CPU和I/O传输。
use EasySwoole\\EasySwoole\\Task\\TaskManager;
TaskManager::getInstance()-&gt;async(function () use ($tableName,$data) {
// todo code ...
});

  • 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-&gt;zAdd(self::PUSH_MSG_AUTHOR_NOTICE_SYSTEM, $uid, $fd);
}, self::REDIS_CONN_NAME);
}
## defer方式
$redis = \\EasySwoole\\RedisPool\\RedisPool::defer(\'redis\');
$data = $redis-&gt;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 Bytes
  • Server Push: 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。

//$fd,指的是系统里的文件描述符fd
use 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 webSocket消息服务系统代码设计详解的详细内容,更多关于Swoole webSocket消息服务的资料请关注其它相关文章!

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 PHP教程 Swoole webSocket消息服务系统代码设计详解 http://www.20zxx.cn/813422/xuexijiaocheng/qes.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务