详解基于swoole的mysql连接池实现
发布时间 - 2020-12-25 00:00:00 点击率:次swoole框架栏目介绍swoole实现mysql连接池的方法
推荐(免费):swoole框架
前言
传统的nginx+FPM模式的PHP程序而言,每次请求FPM的worker都会连接一次mysql,然后请求结束便会断开连接。对于并发小的应用来说这不会有什么问题,但是对于高并发的应用来说,频繁建立连接Connect和销毁连接Close,数据库便会成为瓶颈,相信不少人也遇到过to many connection的mysql报错吧。
连接池的优势
连接池采用的是长连接模式,会一直保持与MySQL的连接,用完后会重新放回连接池,从而节省了建立连接和断开连接的消耗,大大降低了系统IO的消耗,一定程度上提高了程序的并发性能。如果连接池空闲,就从连接池分配一个连接,否则,请求将被加入到等待队列中。
实现
我们采用swoole实现mysql连接池
连接池类
pool)) {
$this->config = $config;
$this->pool = new \Swoole\Coroutine\Channel($config['pool_size']);
for ($i = 0; $i < $config['pool_size']; $i++) {
\go(function() use ($config) {
$mysql = new MysqlDB();
$res = $mysql->connect($config['mysql']);
if ($res === false) {
throw new RuntimeException("Failed to connect mysql server");
} else {
$this->pool->push($mysql);
}
});
}
}
}
public function get()
{
if ($this->pool->length() > 0) {
$mysql = $this->pool->pop($this->config['pool_get_timeout']);
if (false === $mysql) {
throw new RuntimeException("Pop mysql timeout");
}
return $mysql;
} else {
throw new RuntimeException("Pool length <= 0");
}
}
public function recycle(MysqlDB $mysql){
$this->pool->push($mysql);
}
/**
* 获取连接池长度
* @return mixed
*/
public function getPoolSize(){
return $this->pool->length();
}}数据库DB类
connect($config);
if ($res === false) {
throw new RuntimeException($connection->connect_error, $connection->errno);
} else {
$this->connection = $connection;
}
return $res;
}
public function query($sql){
$result = $this->connection->query($sql);
return $result;
}}在HTTP协程服务器中创建连接池
5,
'pool_get_timeout'=>1,
'timeout'=>1,
'charset'=>'utf8',
'strict_type'=>false,
'fetch_mode'=>true,
'mysql'=>[
'host'=>'127.0.0.1',
'port'=>'3306',
'user'=>'homestead',
'password'=>'secret',
'database'=>'blog',
]
]);
$server->handle('/', function ($request, $response) use ($pool){
$mysql = $pool->get();
$res = $mysql->query("select id,phone,username from user limit 1");
var_dump($res);
$pool->recycle($mysql);
$response->end("Test
");
});
$server->handle('/test', functio
n ($request, $response) {
$response->end("Test
");
});
$server->handle('/stop', function ($request, $response) use ($server) {
$response->end("Stop
");
$server->shutdown();
});
$server->start();});源码地址 swoole-mysql-pool
相关免费学习推荐:mysql视频教程
# swoole
# 连接池
# 便会
# 的是
# 会有
# 将被
# 报错
# 后会
# 什么问题
# 用完
# 遇到过
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
青岛网站建设如何选择本地服务器?
Laravel如何生成URL和重定向?(路由助手函数)
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
jQuery validate插件功能与用法详解
如何破解联通资金短缺导致的基站建设难题?
如何在腾讯云免费申请建站?
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
如何利用DOS批处理实现定时关机操作详解
详解jQuery中基本的动画方法
如何在万网自助建站中设置域名及备案?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
html如何与html链接_实现多个HTML页面互相链接【互相】
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel Docker环境搭建教程_Laravel Sail使用指南
canvas 画布在主流浏览器中的尺寸限制详细介绍
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何快速生成高效建站系统源代码?
使用spring连接及操作mongodb3.0实例
中山网站制作网页,中山新生登记系统登记流程?
如何在云主机上快速搭建网站?
详解Oracle修改字段类型方法总结
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Swift开发中switch语句值绑定模式
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Android滚轮选择时间控件使用详解
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Android okhttputils现在进度显示实例代码
如何快速建站并高效导出源代码?
如何在建站之星绑定自定义域名?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel Fortify是什么,和Jetstream有什么关系
装修招标网站设计制作流程,装修招标流程?
Laravel怎么使用artisan命令缓存配置和视图
如何解决hover在ie6中的兼容性问题
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
音乐网站服务器如何优化API响应速度?
如何在Windows环境下新建FTP站点并设置权限?
详解Huffman编码算法之Java实现
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
网站图片在线制作软件,怎么在图片上做链接?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程


n ($request, $response) {
$response->end("