详解基于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', function ($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教程