站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        詳解基于swoole的mysql連接池實現(xiàn)

        swoole框架欄目介紹swoole實現(xiàn)mysql連接池的方法

        詳解基于swoole的mysql連接池實現(xiàn)

        推薦(免費):swoole框架

        前言

        傳統(tǒng)的nginx+FPM模式的PHP程序而言,每次請求FPM的worker都會連接一次mysql,然后請求結束便會斷開連接。對于并發(fā)小的應用來說這不會有什么問題,但是對于高并發(fā)的應用來說,頻繁建立連接Connect和銷毀連接Close,數(shù)據(jù)庫便會成為瓶頸,相信不少人也遇到過to many connection的mysql報錯吧。

        連接池的優(yōu)勢

        連接池采用的是長連接模式,會一直保持與MySQL的連接,用完后會重新放回連接池,從而節(jié)省了建立連接和斷開連接的消耗,大大降低了系統(tǒng)IO的消耗,一定程度上提高了程序的并發(fā)性能。如果連接池空閑,就從連接池分配一個連接,否則,請求將被加入到等待隊列中。

        實現(xiàn)

        我們采用swoole實現(xiàn)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 SwooleCoroutineChannel($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();     }}
        數(shù)據(jù)庫DB類
        <?phpclass MysqlDB{     private $connection;      public function connect($config)     {         $connection = new SwooleCoroutineMySQL();         $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;     }}
        在HTTP協(xié)程服務器中創(chuàng)建連接池
        <?php require_once "MysqlPool.php";Corun(function () {     $server = new CoHttpServer("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();});
        源碼地址 swoole-mysql-pool

        相關免費學習推薦:mysql視頻教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 人妻少妇精品视频一区二区三区| 久久久精品国产sm调教网站| 亚洲国产精品无码专区影院 | 久久精品人人槡人妻人人玩AV| 国产精品一区二区av不卡| 99精品国产高清一区二区麻豆 | 亚洲国产精品一区二区久久| 亚洲AV无码国产精品色午友在线| 精品亚洲欧美中文字幕在线看| 久久99精品国产| 国产精品丝袜黑色高跟鞋| 亚洲精品人成无码中文毛片 | 亚洲欧美日韩国产精品| 国产精品无码一区二区在线观一 | 久久ww精品w免费人成| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 网友偷拍日韩精品| 久久se精品一区二区影院| 国产成人精品福利网站在线观看| 欧美日韩国产精品系列| 亚洲精品欧美综合| AV无码精品一区二区三区| 久久丫精品国产亚洲av不卡| 在线精品动漫一区二区无广告| 久久久久成人精品无码| 黑人无码精品又粗又大又长| 国产乱人伦偷精品视频免观看| 亚洲天堂久久精品| 6080亚洲精品午夜福利| 日本精品久久久久中文字幕| 国产99久久精品一区二区| 99久久精品国内| 99久久国语露脸精品国产| A级精品国产片在线观看| 国内精品九九久久久精品| 久久精品欧美日韩精品| 精品熟女少妇av免费久久| 日韩精品极品视频在线观看免费| 无码日韩人妻精品久久蜜桃| 色欲国产麻豆一精品一AV一免费| 午夜天堂精品久久久久|