mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)
open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池。
依赖
依赖版本PHP>=7.0.0
Swoole>=4.2.9Recommend 4.2.13+
安装
通过Composer安装。
composer require "open-smf/connection-pool:~1.0"
使用
更多示例。
- 可用的连接器
连接器说明CoroutineMySQLConnectorSwooleCoroutineMySQL
的实例CoroutinePostgreSQLConnectorSwooleCoroutinePostgreSQL
的实例,编译Swoole
时需要添加参数--enable-coroutine-postgresql
CoroutineRedisConnectorSwooleCoroutineRedis
的实例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)相关推荐
- swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池
连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...
- mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...
- mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...
- ef mysql 连接数_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽
原标题:EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext ...
- swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...
swoole-orm 基于swoole的mysql协程连接池,简单封装. 实现多个协程间共用同一个协程客户端 感谢完善 [1]:nowbe -> 新增数据返回insert_id 版本 v0.0. ...
- java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅
阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...
- C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接. 一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列. 当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队 ...
- mysql连接池泄露_一次线上故障:数据库连接池泄露后的思考
作者:陈朗,普兰金融科技能效工程部开发工程师 一:初步排查 早上作为能效平台系统的使用高峰期,系统负载通常比其它时间段更大一些,某个时间段会有大量用户登录.当天系统开始有用户报障,发布系统线上无法构建 ...
- e2ee连接mysql数据库_E2EE应用服务器套件 - 文档 - [高级功能] 使用数据库连接池 - E2EE易语言网站敏捷开发框架...
使用数据库连接池 E2EE内置ADO作为通用数据库解决方案. 使用数据库连接池和操作数据库主要有三个对象: ADODB数据库连接池 ADODB数据库连接 ADODB数据库分页 1. 创建连接池 创建数 ...
最新文章
- PHP根据IP获取当前所在地地址
- linux压缩命令 实例子,Linux下的tar压缩解压缩命令详解及使用实例分析
- 产品经理第一课上海站圆满结束,下一站你定!
- linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...
- 我犯的错误--关于主键
- Socket之UDP客户端【Python】
- 18个最常用的Win8快捷键
- C/C++常见标准头文件前格式探讨
- 图像处理随笔——非极大值抑制
- 漫威蜘蛛侠Mac动态壁纸
- python实现一款编译型语言_Java,Python谁是编译型语言,谁是解释型语
- python全局变量定义_python全局变量和局部变量的概念
- java子窗口获取父窗口句柄_java获得窗口句柄
- 手把手带你在Java中用【数组】和【链表】实现栈
- python通过榛子云短信平台发送短信验证码
- Py之pyod:pyod的简介、安装、使用方法之详细攻略
- php环境扩展安装流程
- 入门知识(二)WPF所有的画刷工具
- 关于c语言在循环赋值字符时出现乱码情况
- Angular开发之——Angular介绍(01)