Heim  >  Artikel  >  PHP-Framework  >  Detaillierte Erläuterung der Implementierung des MySQL-Verbindungspools basierend auf Swoole

Detaillierte Erläuterung der Implementierung des MySQL-Verbindungspools basierend auf Swoole

coldplay.xixi
coldplay.xixinach vorne
2020-12-25 17:18:167018Durchsuche

Swoole-FrameworkIn der Kolumne wird vorgestellt, wie Swoole den MySQL-Verbindungspool implementiert Jeder Arbeiter fordert FPM stellt einmal eine Verbindung zu MySQL her und trennt die Verbindung, nachdem die Anforderung abgeschlossen ist. Bei Anwendungen mit geringer Parallelität stellt dies kein Problem dar, aber bei Anwendungen mit hoher Parallelität wird die Datenbank zu einem Engpass, wenn die Verbindung häufig hergestellt wird und die Verbindung zerstört wird. Ich glaube, dass viele Leute auch auf viele Verbindungen gestoßen sind meldet einen Fehler.

Detaillierte Erläuterung der Implementierung des MySQL-Verbindungspools basierend auf Swoole

Vorteile des Verbindungspools

Der Verbindungspool verwendet den langen Verbindungsmodus, der die Verbindung mit MySQL immer aufrechterhält. Nach der Verwendung wird sie wieder in den Verbindungspool eingefügt, wodurch der Aufwand für das Herstellen und Trennen von Verbindungen eingespart wird , was den E/A-Verbrauch des Systems erheblich reduziert und die Leistung der Programmparallelität bis zu einem gewissen Grad verbessert. Wenn der Verbindungspool frei ist, wird eine Verbindung aus dem Verbindungspool zugewiesen, andernfalls wird die Anforderung zur Warteschlange hinzugefügt.

Implementierung

Wir verwenden Swoole, um den MySQL-Verbindungspool zu implementieren.

Verbindungspoolklasse

<?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();
    }}

Quelle Codeadresse swoole-mysql-pool

Verwandte kostenlose Lernempfehlungen:

MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Implementierung des MySQL-Verbindungspools basierend auf Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen