Maison >cadre php >Swoole >Explication détaillée de la mise en œuvre du pool de connexions MySQL basée sur Swoole

Explication détaillée de la mise en œuvre du pool de connexions MySQL basée sur Swoole

coldplay.xixi
coldplay.xixiavant
2020-12-25 17:18:167372parcourir

framework swooleLa colonne présente la méthode de swoole pour implémenter le pool de connexions mysql

Explication détaillée de la mise en œuvre du pool de connexions MySQL basée sur Swoole

Recommandé (gratuit) : swoole framework

Avant-propos

Pour le programme PHP traditionnel en mode nginx+FPM, chaque fois que le travailleur demande FPM, il se connectera une fois à MySQL, puis la demande se termine et sera déconnectée. Pour les applications avec une faible concurrence, cela ne posera pas de problème. Cependant, pour les applications avec une concurrence élevée, la base de données deviendra un goulot d'étranglement si la connexion est fréquemment établie et que la connexion est détruite, je pense que de nombreuses personnes ont également rencontré de nombreuses connexions. Mysql signale une erreur.

Avantages du pool de connexions

Le pool de connexions utilise un mode de connexion long, qui maintiendra toujours la connexion avec MySQL, et sera remis dans le pool de connexions après Utilisation, cela permet ainsi d'économiser la consommation d'établissement et de déconnexion des connexions, de réduire considérablement la consommation d'E/S du système et d'améliorer les performances de concurrence du programme dans une certaine mesure. Si le pool de connexions est libre, une connexion est allouée depuis le pool de connexions, sinon la requête sera ajoutée à la file d'attente.

Implémentation

Nous utilisons swoole pour implémenter le pool de connexions MySQL

Classe de pool de connexions
<?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[&#39;pool_size&#39;]; $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();
    }}
Classe de base de données
<?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;
    }}
Créer un pool de connexions dans le serveur de coroutine HTTP
<?php
require_once "MysqlPool.php";\Co\run(function () {
    $server = new \Co\Http\Server("0.0.0.0", 9501, false);
    $pool = MysqlPool::getInstance([
        &#39;pool_size&#39;=>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();});
Adresse du code source swoole-mysql- pool

Recommandations d'apprentissage gratuites associées : tutoriel vidéo mysql

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer