Maison > cadre php > Swoole > le corps du texte

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

coldplay.xixi
Libérer: 2020-12-25 17:18:16
avant
7182 Les gens l'ont consulté

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();
    }}
Copier après la connexion
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;
    }}
Copier après la connexion
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();});
Copier après la connexion
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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal