swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池
连接池
open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池。
依赖
依赖
版本
>=7.0.0
>=4.2.9 Recommend 4.2.13+
安装
composer require "open-smf/connection-pool:~1.0"
使用
更多示例。
可用的连接器
连接器
说明
CoroutineMySQLConnector
Swoole\Coroutine\MySQL的实例
CoroutinePostgreSQLConnector
Swoole\Coroutine\PostgreSQL的实例,编译Swoole时需要添加参数--enable-coroutine-postgresql
CoroutineRedisConnector
Swoole\Coroutine\Redis的实例
PhpRedisConnector
Redis的实例,需要安装redis
PDOConnector
PDO的实例,需要安装PDO
YourConnector
YourConnector必须实现接口ConnectorInterface,任何对象均可作为连接实例
基本用法
use Smf\ConnectionPool\ConnectionPool;
use Smf\ConnectionPool\Connectors\CoroutineMySQLConnector;
use Swoole\Coroutine\MySQL;
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 Smf\ConnectionPool\ConnectionPool;
use Smf\ConnectionPool\ConnectionPoolTrait;
use Smf\ConnectionPool\Connectors\CoroutineMySQLConnector;
use Smf\ConnectionPool\Connectors\PhpRedisConnector;
use Swoole\Coroutine\MySQL;
use Swoole\Http\Request;
use Swoole\Http\Response;
use Swoole\Http\Server;
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扩展一键协程化
Swoole\Runtime::enableCoroutine(true);
$server = new HttpServer('0.0.0.0', 5200);
$server->start();
本人已用于生产环境,表现稳定
贡献
Github,欢迎 Star & PR。
swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池相关推荐
- mysql连接池_基于Swoole的通用连接池 - 数据库连接池(life)
open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖版本PHP>=7.0.0Swoole>=4.2.9Recommend ...
- swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...
swoole-orm 基于swoole的mysql协程连接池,简单封装. 实现多个协程间共用同一个协程客户端 感谢完善 [1]:nowbe -> 新增数据返回insert_id 版本 v0.0. ...
- 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 ...
- java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅
阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...
- tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗?
本节将会讲解以下3个问题: 通过Swoole如何搭建TCP服务? 通过Swoole如何搭建TCP客户端? 通过Swoole搭建的TCP服务,更深入理解Swoole的事件驱动模式 通过Swoole可以快 ...
- C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接. 一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列. 当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队 ...
- mysql连接池泄露_一次线上故障:数据库连接池泄露后的思考
作者:陈朗,普兰金融科技能效工程部开发工程师 一:初步排查 早上作为能效平台系统的使用高峰期,系统负载通常比其它时间段更大一些,某个时间段会有大量用户登录.当天系统开始有用户报障,发布系统线上无法构建 ...
最新文章
- Web开发的机器学习框架
- Docker 容器技术 — Image
- javascript宿主对象之window.history
- CSP认证201609-4	交通规划[C++题解]:最短路径树、dijkstra求单源最短路、递推思想
- java 集合类简单的分析1
- Spring Boot错误errMsg: request:ok
- C++异常(exception)第一篇--综合讲解
- java undo_用JAVA实现Undo、Redo,Copy、Paste、Cut_java
- php 支付宝付款接口测试
- 阻塞非阻塞,同步异步四种I/O方式
- atitit.设计模式(2) -----查表模式/ command 总结
- 搞笑--亚阳影视官方的keyword里写“破解版”
- 《云计算核心技术剖析》迷你书连载一 – 首席的推荐和前言
- 危害极大的计算机病毒cih发作的日期是,计算机病毒防治(答案)
- jQuery——常用API
- 地球人来源2【地底爬虫人访谈】
- 2020计算机软考初级都考什么,软考都考什么内容
- xp系统怎么telnet服务器,xp操作系统如何开启telnet服务?
- 终于知道什么是URL编码
- C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值:
热门文章
- JavaScript中Element与Node的区别,children与childNodes的区别
- 获取当前项目的根目录的方法
- XJava程序设计专家门诊
- python 面试题(1)--- python模块
- Vue中diff算法的理解
- 更换高端游戏计算机故障电源,加内存条后电脑重启的解决办法游戏设备故障解决分享!...
- Java 8 Lambda表达式基础语法
- kubernetes 数据_为什么数据科学家喜欢Kubernetes
- 开源 区块链_区块链如何补充开源
- 开源项目贡献者_扩大项目贡献者基础的5种方法