open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池。

依赖

依赖版本PHP>=7.0.0Swoole>=4.2.9Recommend 4.2.13+

安装

通过Composer安装。

composer require "open-smf/connection-pool:~1.0"

使用

更多示例。

  • 可用的连接器

连接器说明CoroutineMySQLConnectorSwooleCoroutineMySQL的实例CoroutinePostgreSQLConnectorSwooleCoroutinePostgreSQL的实例,编译Swoole时需要添加参数--enable-coroutine-postgresqlCoroutineRedisConnectorSwooleCoroutineRedis的实例PhpRedisConnectorRedis的实例,需要安装redisYourConnectorYourConnector必须实现接口ConnectorInterface,任何对象均可作为连接实例

程序猿的生活:【粉丝福利】30G-PHP进阶资料,拿到你也能30K,免费领取​zhuanlan.zhihu.com

  • 基本用法
use SmfConnectionPoolConnectionPool;
use SmfConnectionPoolConnectorsCoroutineMySQLConnector;
use SwooleCoroutineMySQL;go(function () {// MySQL连接数区间:[10, 30]$pool = new ConnectionPool(['minActive'         => 10,'maxActive'         => 30,'maxWaitTime'       => 5,'maxIdleTime'       => 20,'idleCheckInterval' => 10,],new CoroutineMySQLConnector, // 指明连接器实例,这里使用协程MySQL连接器,这样就可以创建一个协程MySQL的数据库连接池['host'        => '127.0.0.1','port'        => '3306','user'        => 'root','password'    => 'xy123456','database'    => 'mysql','timeout'     => 10,'charset'     => 'utf8mb4','strict_type' => true,'fetch_mode'  => true,]);echo "初始化连接池...n";$pool->init();defer(function () use ($pool) {echo "关闭连接池...n";$pool->close();});echo "从连接池中借出连接...n";/**@var MySQL $connection */$connection = $pool->borrow();// 执行查询语句$status = $connection->query('SHOW STATUS LIKE "Threads_connected"');echo "用完连接后,尽快归还...n";$pool->return($connection);var_dump($status);
});

  • 在Swoole Server中的用法
use SmfConnectionPoolConnectionPool;
use SmfConnectionPoolConnectionPoolTrait;
use SmfConnectionPoolConnectorsCoroutineMySQLConnector;
use SmfConnectionPoolConnectorsPhpRedisConnector;
use SwooleCoroutineMySQL;
use SwooleHttpRequest;
use SwooleHttpResponse;
use SwooleHttpServer;class HttpServer
{use ConnectionPoolTrait;protected $swoole;public function __construct(string $host, int $port){$this->swoole = new Server($host, $port);$this->setDefault();$this->bindWorkerEvents();$this->bindHttpEvent();}protected function setDefault(){$this->swoole->set(['daemonize'             => false,'dispatch_mode'         => 1,'max_request'           => 8000,'open_tcp_nodelay'      => true,'reload_async'          => true,'max_wait_time'         => 60,'enable_reuse_port'     => true,'enable_coroutine'      => true,'http_compression'      => false,'enable_static_handler' => false,'buffer_output_size'    => 4 * 1024 * 1024,'worker_num'            => 4, // 每个Worker持有一个独立的连接池]);}protected function bindHttpEvent(){$this->swoole->on('Request', function (Request $request, Response $response) {$pool1 = $this->getConnectionPool('mysql');/**@var MySQL $mysql */$mysql = $pool1->borrow();$status = $mysql->query('SHOW STATUS LIKE "Threads_connected"');// 用完连接后,尽快归还$pool1->return($mysql);$pool2 = $this->getConnectionPool('redis');/**@var Redis $redis */$redis = $pool2->borrow();$clients = $redis->info('Clients');// 用完连接后,尽快归还$pool2->return($redis);$json = ['status'  => $status,'clients' => $clients,];// Other logic// ...$response->header('Content-Type', 'application/json');$response->end(json_encode($json));});}protected function bindWorkerEvents(){$createPools = function () {// 所有的MySQL连接数区间:[4 workers * 2 = 8, 4 workers * 10 = 40]$pool1 = new ConnectionPool(['minActive' => 2,'maxActive' => 10,],new CoroutineMySQLConnector,['host'        => '127.0.0.1','port'        => '3306','user'        => 'root','password'    => 'xy123456','database'    => 'mysql','timeout'     => 10,'charset'     => 'utf8mb4','strict_type' => true,'fetch_mode'  => true,]);$pool1->init();$this->addConnectionPool('mysql', $pool1);// 所有Redis连接数区间:[4 workers * 5 = 20, 4 workers * 20 = 80]$pool2 = new ConnectionPool(['minActive' => 5,'maxActive' => 20,],new PhpRedisConnector,['host'     => '127.0.0.1','port'     => '6379','database' => 0,'password' => null,]);$pool2->init();$this->addConnectionPool('redis', $pool2);};$closePools = function () {$this->closeConnectionPools();};// Worker启动时创建MySQL和Redis连接池$this->swoole->on('WorkerStart', $createPools);// Worker正常退出或错误退出时,关闭连接池,释放连接$this->swoole->on('WorkerStop', $closePools);$this->swoole->on('WorkerError', $closePools);}public function start(){$this->swoole->start();}
}// 启用协程Runtime来让PhpRedis扩展一键协程化
SwooleRuntime::enableCoroutine(true);
$server = new HttpServer('0.0.0.0', 5200);
$server->start();

  • 本人已用于生产环境,表现稳定

贡献

Github,欢迎 Star & PR。
原文来自思否https://segmentfault.com/a/1190

mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)相关推荐

  1. swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池

    连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...

  2. mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  3. mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  4. ef mysql 连接数_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    原标题:EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext ...

  5. swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...

    swoole-orm 基于swoole的mysql协程连接池,简单封装. 实现多个协程间共用同一个协程客户端 感谢完善 [1]:nowbe -> 新增数据返回insert_id 版本 v0.0. ...

  6. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

  7. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...

    在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接. 一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列. 当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队 ...

  8. mysql连接池泄露_一次线上故障:数据库连接池泄露后的思考

    作者:陈朗,普兰金融科技能效工程部开发工程师 一:初步排查 早上作为能效平台系统的使用高峰期,系统负载通常比其它时间段更大一些,某个时间段会有大量用户登录.当天系统开始有用户报障,发布系统线上无法构建 ...

  9. e2ee连接mysql数据库_E2EE应用服务器套件 - 文档 - [高级功能] 使用数据库连接池 - E2EE易语言网站敏捷开发框架...

    使用数据库连接池 E2EE内置ADO作为通用数据库解决方案. 使用数据库连接池和操作数据库主要有三个对象: ADODB数据库连接池 ADODB数据库连接 ADODB数据库分页 1. 创建连接池 创建数 ...

最新文章

  1. PHP根据IP获取当前所在地地址
  2. linux压缩命令 实例子,Linux下的tar压缩解压缩命令详解及使用实例分析
  3. 产品经理第一课上海站圆满结束,下一站你定!
  4. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...
  5. 我犯的错误--关于主键
  6. Socket之UDP客户端【Python】
  7. 18个最常用的Win8快捷键
  8. C/C++常见标准头文件前格式探讨
  9. 图像处理随笔——非极大值抑制
  10. 漫威蜘蛛侠Mac动态壁纸
  11. python实现一款编译型语言_Java,Python谁是编译型语言,谁是解释型语
  12. python全局变量定义_python全局变量和局部变量的概念
  13. java子窗口获取父窗口句柄_java获得窗口句柄
  14. 手把手带你在Java中用【数组】和【链表】实现栈
  15. python通过榛子云短信平台发送短信验证码
  16. Py之pyod:pyod的简介、安装、使用方法之详细攻略
  17. php环境扩展安装流程
  18. 入门知识(二)WPF所有的画刷工具
  19. 关于c语言在循环赋值字符时出现乱码情况
  20. Angular开发之——Angular介绍(01)

热门文章

  1. 连通图的判断(并查集, DFS, BFS)
  2. 分数化小数(模拟除法操作)
  3. Android园区部队人脸识别源码门禁项目讲解
  4. 深入出不来nodejs源码-编译启动
  5. Linux 文件大小 文件夹大小 磁盘大小
  6. Redis的安装和部署
  7. 专业实训题目需求分析
  8. Microsoft 数据访问组件 (MDAC) 的版本历史记录
  9. Android屏幕适应详解(一)
  10. UA OPTI501 电磁波 Lorentz Oscillator Model 1 Drude-Lorentz模型