连接池

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的通用连接池 - 数据库连接池相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗?

    本节将会讲解以下3个问题: 通过Swoole如何搭建TCP服务? 通过Swoole如何搭建TCP客户端? 通过Swoole搭建的TCP服务,更深入理解Swoole的事件驱动模式 通过Swoole可以快 ...

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

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

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

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

最新文章

  1. Web开发的机器学习框架
  2. Docker 容器技术 — Image
  3. javascript宿主对象之window.history
  4. CSP认证201609-4 交通规划[C++题解]:最短路径树、dijkstra求单源最短路、递推思想
  5. java 集合类简单的分析1
  6. Spring Boot错误errMsg: request:ok
  7. C++异常(exception)第一篇--综合讲解
  8. java undo_用JAVA实现Undo、Redo,Copy、Paste、Cut_java
  9. php 支付宝付款接口测试
  10. 阻塞非阻塞,同步异步四种I/O方式
  11. atitit.设计模式(2) -----查表模式/ command 总结
  12. 搞笑--亚阳影视官方的keyword里写“破解版”
  13. 《云计算核心技术剖析》迷你书连载一 – 首席的推荐和前言
  14. 危害极大的计算机病毒cih发作的日期是,计算机病毒防治(答案)
  15. jQuery——常用API
  16. 地球人来源2【地底爬虫人访谈】
  17. 2020计算机软考初级都考什么,软考都考什么内容
  18. xp系统怎么telnet服务器,xp操作系统如何开启telnet服务?
  19. 终于知道什么是URL编码
  20. C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值:

热门文章

  1. JavaScript中Element与Node的区别,children与childNodes的区别
  2. 获取当前项目的根目录的方法
  3. XJava程序设计专家门诊
  4. python 面试题(1)--- python模块
  5. Vue中diff算法的理解
  6. 更换高端游戏计算机故障电源,加内存条后电脑重启的解决办法游戏设备故障解决分享!...
  7. Java 8 Lambda表达式基础语法
  8. kubernetes 数据_为什么数据科学家喜欢Kubernetes
  9. 开源 区块链_区块链如何补充开源
  10. 开源项目贡献者_扩大项目贡献者基础的5种方法