当前位置: 首页 > 后端技术 > PHP

基于Swoole2协程特性的MySQL连接池

时间:2023-03-29 13:55:34 PHP

使用Swoole2的Swoole协程MySQL创建连接,通过静态类和静态成员属性维护连接池。不同的协程可以共享连接池。排队机制(先进先出)是利用协程的特殊函数实现的:SwooleCoroutine::resume($name):从$name域名恢复一个挂起的协程执行;SwooleCoroutine::suspend($name):挂起当前协程进程挂在轴$name本身。限制每个worker都有自己的MySQL连接池,不同的worker不能共享彼此的MySQL连接池;每个工作进程的连接池最大化可能存在差异(取决于业务实现)。优点与独立连接池(worker进程间共享连接池的实现)相比,没有进程间通信开销;独立的连接池需要增加运维成本。使用方法/***初始化连接池**@paramarray$connsConfig配置数组*[*'connName1'=>[*'serverInfo'=>['host'=>'127.0.0.1','user'=>'test','password'=>'pass','database'=>'tt','charset'=>'utf8'],//\Swoole\Coroutine\MySQL连接参数*'maxSpareConns'=>5,//最大连接数*'maxConns'=>10,//最大连接数*],*'connName2'=>[*'serverInfo'=>['host'=>'127.0.0.2','user'=>'test','password'=>'pass','database'=>'tt','charset'=>'utf8'],//\Swoole\Coroutine\MySQL的连接参数*'maxSpareConns'=>5,//最大连接数*'maxConns'=>10,//最大连接数*],*]*/Swoole\Coroutine\Pool\MySQLPool::init(array$connsConfig)/***回收连接,连接必须是从连接池中获取的连接**@param\Swoole\Coroutine\MySQL$conn从连接池中获取的连接*/Swoole\Coroutine\Pool\MySQLPool::recycle(\Swoole\Coroutine\MySQL$conn)/***从连接池中获取一个连接**@paramstring$connNameinit时配置的连接,根据连接名获取对应的连接*@return\Swoole\Coroutine\MySQL返回连接实例*/Swoole\Coroutine\Pool\MySQLPool::extract($connName)使用示例<?php需要“MySQLPool.php”;使用Swoole\Coroutine\Pool\MySQLPool;$server=newSwoole\Http\Server("127.0.0.1",9502,SWOOLE_BASE);$server->group(['worker_num'=>1,]);$server->on('request',function($request,$response){MySQLPool::INIT(['test'=>['serverInfo'=>['host'=>'192.168.244.128','user'=>'mha_manager','password'=>'mhapass','database'=>'tt','charset'=>'utf8'],'maxSpareConns'=>5,'maxConns'=>10],]);$swoole_mysql=MySQLPool::fetch('test');$ret=$swoole_mysql->query('selectsleep(1)');MySQLPool::recycle($swoole_mysql);$response->end('测试结束');});$server->start();压测命令:ab-c20-n100-s100http://127.0.0.1:9502/,20个并发,共100个请求压测结果:压测时的连接状态,20个并发,最大连接数限制为10,所以最多只会和数据库建立10个连接:压测后的连接情况,最大连接数connections设置为5,所以现在没有客户从客户端请求时,大部分连接都维持在5:这里只有一个worker进程在服务端工作,完成了100个请求,每个请求的SQL查询request是sleepfor1second,大概需要11秒。如果是php-fpm+mysqli的模式,一个worker进程需要100秒。所以这也正是协程的优势所在。采用非双IO+协程切换,一个worker进程可以同时处理多个client请求,大大提高了吞吐量。大家注意点,别迷路了,以上就是本文的全部内容,能看到这里的都是人才。前面说了PHP的技术点很多,也是因为太多了,写的太多了,写完了也不会看太多,所以我这里整理成了PDF和文档,有需要的可以点击进入秘籍:PHP+「平台」更多学习内容可以访问【比大厂】优质PHP架构师教程目录,只要会看,薪资高会更上一层楼(持续更新)。以上内容希望对大家有所帮助,很多PHPer在进阶的时候总会遇到一些问题和瓶颈。业务代码写多了就没有方向感。架构、高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等进阶知识点级别的干货,可以免费分享给大家,需要的话可以加入我的PHP技术交流群