站長資訊網
        最全最豐富的資訊網站

        詳解基于swoole的mysql連接池實現

        swoole框架欄目介紹swoole實現mysql連接池的方法

        詳解基于swoole的mysql連接池實現

        推薦(免費):swoole框架

        前言

        傳統的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 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();     }}
        數據庫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協程服務器中創建連接池
        <?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)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 狠狠精品干练久久久无码中文字幕| 欧美精品黑人粗大视频| 国产精品熟女福利久久AV| 日韩人妻精品无码一区二区三区 | 国产精品网址在线观看你懂的| 亚洲AV无码精品色午夜果冻不卡| 国产精品福利片免费看| 91麻豆精品国产| 蜜国产精品jk白丝AV网站| 亚洲精品无码久久不卡| 国内精品视频在线观看| 2021国产三级精品三级在专区| 精品无码一区二区三区爱欲九九| 亚洲精品国自产拍在线观看| 精品国偷自产在线视频| 亚洲精品欧美综合在线| 国产精品扒开腿做爽爽爽视频| 亚洲精品乱码久久久久久蜜桃不卡 | 99久久精品国产一区二区蜜芽| 精品多毛少妇人妻AV免费久久 | 无码人妻精品一区二区三18禁| 精品99久久aaa一级毛片| 亚洲国产精品久久久久网站 | 久久www免费人成精品香蕉| 91精品国产自产在线观看| 国产精品一二区| 99精品免费视品| 潮喷大喷水系列无码久久精品| 精品久久久久久成人AV| 无码人妻精品一区二区| 亚洲爆乳精品无码一区二区三区| 亚洲国产精品自产在线播放 | 国产精品.XX视频.XXTV| 亚洲国产精品婷婷久久| 久久亚洲国产欧洲精品一| 国产精品福利一区二区久久| 91精品国产综合久久精品| 国产精品伦一区二区三级视频| 久久国产乱子伦免费精品| 无码精品A∨在线观看中文| 日韩精品国产另类专区|