基于swoole协程的mysql连接池
前言
传统的nginx+FPM模式的PHP程序而言,每次请求FPM的worker都会连接一次mysql,然后请求结束便会断开连接。对于并发小的应用来说这不会有什么问题,但是对于高并发的应用来说,频繁建立连接Connect和销毁连接Close,数据库便会成为瓶颈,相信不少人也遇到过to many connection的mysql报错吧。
连接池的优势
连接池采用的是长连接模式,会一直保持与MySQL的连接,用完后会重新放回连接池,从而节省了建立连接和断开连接的消耗,大大降低了系统IO的消耗,一定程度上提高了程序的并发性能。如果连接池空闲,就从连接池分配一个连接,否则,请求将被加入到等待队列中。
实现
【基于swoole协程的mysql连接池】我们采用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', function ($request, $response) {
$response->end("Test");
});
$server->handle('/stop', function ($request, $response) use ($server) {
$response->end("Stop");
$server->shutdown();
});
$server->start();
});
源码地址 laravel-model
推荐阅读
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- 使用协程爬取网页,计算网页数据大小
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- 韵达基于云原生的业务中台建设 | 实战派
- EasyOA|EasyOA 基于SSM的实现 未完成总结与自我批判
- 基于stm32智能风扇|基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- stm32|基于STM32和freeRTOS智能门锁设计方案