我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Swoole webSocket消息服务系统代码怎么写

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Swoole webSocket消息服务系统代码怎么写

本文小编为大家详细介绍“Swoole webSocket消息服务系统代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Swoole webSocket消息服务系统代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

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

项目初始目录结构:

├── EasySwooleEvent.php├── bootstrap.php├── composer.json├── composer.lock├── dev.php├── easyswoole├── produce.php└── vendor

注册服务 与启动加载

在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);    }}

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

<?phpuse 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客户端链接的间隔    ],];

注册redis链接池

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

注册自定义log

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

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

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

添加热启动

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);

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

-mode 说明启动服务类型 -d 以守护进程的方式

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

异步和 DB(Redis/Mysql)使用

高性能的异步操作

如果是不依赖于结果的计算,异步操作提高性能的有效手段之一,异步操作不需要等待结果,更好的利用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)通信&mdash;&mdash;允许服务器主动发送信息给客户端。

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

  • 如果轮询时间间隔太短,会导致客户端和服务端在一个时间段内不断的进行http tcp的握手/挥手动作和http 请求头,响应头的传输,大量消耗服务器资源,如果用户量大的情况,会造成服务器的繁忙以至于宕机

  • 客户端每次只能通过发送http 请求获得服务器是否有数据返回,且数据的及时性无法保证

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

2.WebSocket协议实现原理

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

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

  • Header: 互相沟通的Header是很小的-大概只有 2 Bytes

  • Server 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 webSocket消息服务系统代码怎么写”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Swoole webSocket消息服务系统代码怎么写

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Swoole webSocket消息服务系统代码怎么写

本文小编为大家详细介绍“Swoole webSocket消息服务系统代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Swoole webSocket消息服务系统代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-07-05

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

这篇文章主要为大家介绍了Swoole webSocket消息服务系统代码设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-23

Swoole webSocket消息服务系统怎么设计

本篇内容介绍了“Swoole webSocket消息服务系统怎么设计”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现方案用户消息服务主要有
2023-07-05

Swoole webSocket客服IM消息系统怎么实现

这篇文章主要讲解了“Swoole webSocket客服IM消息系统怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole webSocket客服IM消息系统怎么实现”吧!实现方
2023-07-05

Swoole webSocket消息服务系统压力测试解析

这篇文章主要为大家介绍了Swoole webSocket消息服务系统压力测试解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-14

Swoole webSocket消息服务系统压力如何测试

本篇内容主要讲解“Swoole webSocket消息服务系统压力如何测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Swoole webSocket消息服务系统压力如何测试”吧!概述编程的内
2023-07-05

Swoole webSocket客服IM消息系统方案解析

这篇文章主要为大家介绍了Swoole webSocket客服IM消息系统方案解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-14

java电子商务系统代码怎么写

编写一个完整的Java电子商务系统的代码是一个庞大的任务,需要涉及数据库设计、用户界面设计、业务逻辑实现等多个方面。以下是一个简单的示例,帮助你入门:1. 数据库设计:- 创建一个名为"users"的表,包含以下字段:id(主键)、user
2023-08-24

java实现人员信息管理系统的代码怎么写

今天小编给大家分享一下java实现人员信息管理系统的代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现增删改查.j
2023-06-29

Java学生管理系统的代码怎么写

这篇文章主要介绍“Java学生管理系统的代码怎么写”,在日常操作中,相信很多人在Java学生管理系统的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java学生管理系统的代码怎么写”的疑惑有所帮助!
2023-07-02

C++实现简易选课系统代码怎么写

今天就跟大家聊聊有关C++实现简易选课系统代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。下面是详细代码分享:#includeusing nam
2023-06-22

云服务器测试代码怎么写

云服务器测试代码可以分为以下几个部分:环境搭建和配置在测试环境的搭建和配置方面,可以先搭建一个测试用例,然后对服务器进行搭建和设置,如CPU、内存、网络等,接着在测试环境中运行测试用例。在测试中需要对每个功能点进行单元测试,并对数据进行存储和传输,以确保数据的正确性。同时需要设置测试环境的各项参数,如环境温度、湿度、电压等,以保证测试的准确性和稳定性。服务器内置功能测试服务器内置功能测试可以在服务器上实现对...
2023-10-27

python实现图书管理系统的代码怎么写

这篇文章主要介绍“python实现图书管理系统的代码怎么写”,在日常操作中,相信很多人在python实现图书管理系统的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python实现图书管理系统的代码
2023-06-29

Java实现火车票预订系统的代码怎么写

本文小编为大家详细介绍“Java实现火车票预订系统的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现火车票预订系统的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 一、项目运行环境
2023-06-29

C++实现图书馆管理系统的代码怎么写

这篇文章主要介绍“C++实现图书馆管理系统的代码怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++实现图书馆管理系统的代码怎么写”文章能帮助大家解决问题。总体思想用C++开发图书馆管理系统需
2023-06-29

Unity基于ShaderLab实现光照系统的代码怎么写

今天就跟大家聊聊有关Unity基于ShaderLab实现光照系统的代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、着色器1.顶点片元着色器分顶点着色器和片元着色器,对应渲
2023-06-22

怎么使用C++代码实现学生信息管理系统

今天小编给大家分享一下怎么使用C++代码实现学生信息管理系统的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。编译环境:Micr
2023-06-30

C语言实现图书借阅系统的代码怎么写

本文小编为大家详细介绍“C语言实现图书借阅系统的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言实现图书借阅系统的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。/************
2023-06-29

Python实现图书管理系统设计的代码怎么写

本篇内容介绍了“Python实现图书管理系统设计的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基于python的tkinter,
2023-06-29

C语言实现停车管理系统的代码怎么写

本篇内容主要讲解“C语言实现停车管理系统的代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言实现停车管理系统的代码怎么写”吧!设计题目设停车场是一个可以停放n辆汽车的南北方向的狭长通
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录