swoole的mysql连接池如何实现,连接池有何优势
Admin 2022-07-21 群英技术资讯 578 次浏览
传统的nginx+FPM模式的PHP程序而言,每次请求FPM的worker都会连接一次mysql,然后请求结束便会断开连接。对于并发小的应用来说这不会有什么问题,但是对于高并发的应用来说,频繁建立连接Connect和销毁连接Close,数据库便会成为瓶颈,相信不少人也遇到过to many connection的mysql报错吧。
连接池采用的是长连接模式,会一直保持与MySQL的连接,用完后会重新放回连接池,从而节省了建立连接和断开连接的消耗,大大降低了系统IO的消耗,一定程度上提高了程序的并发性能。如果连接池空闲,就从连接池分配一个连接,否则,请求将被加入到等待队列中。
我们采用swoole实现mysql连接池
<?php require_once "MysqlDB.php";class MysqlPool{ private static $instance; private $pool; private $config; private $pool_get_timeout; /** * 获取mysql进程池单例 * @param null $config * @return MysqlPool */ public static function getInstance($config = null) { if (empty(self::$instance)) { if (empty($config)) { throw new RuntimeException("mysql config is empty"); } self::$instance = new static($config); } return self::$instance; } public function __construct($config) { if (empty($this->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(); }}
<?phpclass MysqlDB{ private $connection; public function connect($config) { $connection = new \Swoole\Coroutine\MySQL(); $res = $connection->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; }}
<?php require_once "MysqlPool.php";\Co\run(function () { $server = new \Co\Http\Server("0.0.0.0", 9501, false); $pool = MysqlPool::getInstance([ 'pool_size'=>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("<h1>Test</h1>"); }); $server->handle('/test', function ($request, $response) { $response->end("<h1>Test</h1>"); }); $server->handle('/stop', function ($request, $response) use ($server) { $response->end("<h1>Stop</h1>"); $server->shutdown(); }); $server->start();});
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在讨论如何使用命名空间之前,必须了解PHP是如何知道要使用哪一个命名空间中的元素的。可以将PHP命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种...
swoole安装失败是因为php版本和编译时使用的phpize和php-config不对应,需要使用绝对路径来进行编译,也就是用绝对路径执行php即可。
在网站功能建设中,php随机数是常用的一个功能,比如用户注册时随机产生的验证码、又比如用户注册时生成随机的一组密码后可自行修改,当用户需要重置密码的时候也需要生成一个随机的密码······随机数就根据特定的规则(或在一个数组范围内)所自动产生的字符串,在php开发中应用广泛,不过php中的随机数也分好几种不同的情况,首先来认识一下PHP提供的随机数函数rand()。
在之前的文章中给大家带来了《PHP中获取时间的方法总结(实例详解)》,其中详细的给大家介绍了PHP中获取时间的5种方法,本篇文章我们继续来看一看PHP中应该怎样去将时间日期格式化和怎样去计算时间差,希望对大家有帮助!
这篇文章主要介绍了Laravel jwt 多表(多用户端)验证隔离的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008