1. 程式人生 > >swoole4-swoole建立Mysql連線池

swoole4-swoole建立Mysql連線池

一 .什麼是mysql連線池

場景:每秒同時有1000個併發,但是這個mysql同時只能處理400個連線,mysql會宕機。

解決方案:連線池,這個連線池建立了200個和mysql的連線,這1000個併發就有順序的共享這連線池中的200個連線。
這個連線池能夠帶來額外的效能提升,因為這個和mysql建立連線的這個過程消耗較大,使用連線池只需連線一次mysql。

連線池定義:永不斷開,要求我們的這個程式是一個常駐記憶體的程式。資料庫連線池(Connection pooling)是程式啟
動時建立足夠的資料庫連線,並將這些連線組成一個連線池,由程式動態地對池中的連線進行申請,使用,釋放。

二.小案例

查詢使用者表資料庫最新註冊的3個會員?
(1)小提示
show processlist #mysql檢視連線數
(2)建立10個mysql連線示例程式碼
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/11/20
 * Time: 14:12
 */
//編寫mysql連線池,這個類只能被例項化一次(單例)
class MysqlConnectionPool
{
    private static $instance;//單例物件
    private $connection_num =
10;//連線數量 private $connection_obj = []; //構造方法連線mysql,建立20mysql連線 private function __construct() { for($i=0;$i<$this->connection_num;$i++){ $dsn = "mysql:host=127.0.0.1;dbnane=swoole"; $this->connection_obj[] = new Pdo($dsn,'root','rootmysql123'); }
} private function __clone() { // TODO: Implement __clone() method. } public static function getInstance() { if(is_null(self::$instance)){ self::$instance = new self(); } } } MysqlConnectionPool::getInstance(); //建立swool的http伺服器物件 $serv = new swoole_http_server('0.0.0.0',8000); //當瀏覽器連結點這個http伺服器的時候,向瀏覽器傳送helloworld $serv->on('request', function($request,$response){ //$request包含這個請求的所有資訊,比如引數 //$response包含返回給瀏覽器的所有資訊,比如helloworld //(2.3)向瀏覽器傳送helloworld $response->end("hello world"); }); //啟動http伺服器 $serv->start();
(3)效果

在這裡插入圖片描述

(4)完善mysql連線池
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/11/20
 * Time: 14:12
 */
//編寫mysql連線池,這個類只能被例項化一次(單例)
class MysqlConnectionPool
{
    private static $instance;//單例物件
    private $connection_num = 20;//連線數量
    private $connection_obj = [];
    private $avil_connection_num = 20;//可用連線

    //構造方法連線mysql,建立20mysql連線
    private function __construct()
    {
        for($i=0;$i<$this->connection_num;$i++){
            $dsn = "mysql:host=127.0.0.1;dbname=swoole";
            $this->connection_obj[] =  new Pdo($dsn,'root','rootmysql123');
        }
    }
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }
    public static function getInstance()
    {
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }

    //執行sql操作
    public function query($sql)
    {
        if($this->avil_connection_num==0){
            throw new Exception("暫時沒有可用的連線誒,請稍後");
        }
        //執行sql語句
        $pdo = array_pop($this->connection_obj);
        //可用連線數減1
        $this->avil_connection_num --;
        //使用從連線池中取出的mysql連線執行查詢,並且把資料取成關聯陣列
        $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
        //把mysql連線放回連線池,可用連線數+1
        array_push($this->connection_obj,$pdo);
        $this->avil_connection_num ++;
        return $rows;
    }
}
//建立swool的http伺服器物件
$serv = new swoole_http_server('0.0.0.0',8000);
//當瀏覽器連結點這個http伺服器的時候,向瀏覽器傳送helloworld
$serv->on('request', function($request,$response){
    //$request包含這個請求的所有資訊,比如引數
    //$response包含返回給瀏覽器的所有資訊,比如helloworld
    //向瀏覽器傳送helloworld
    $stop = false;
    while (!$stop){
        try{
            $sql = "SELECT * FROM user ORDER BY id  DESC LIMIT 5";
            $rows = MysqlConnectionPool::getInstance()->query($sql);
            $response->end(json_encode($rows));
            $stop = true;
        }catch (Exception $e){
            usleep(100000);
        }
    }

});
//啟動http伺服器
$serv->start();