Рубрики
Uncategorized

Универсальный пул подключений пул подключений к базе данных на основе swool

Автор оригинала: David Wong.

Открытый пул CMD/соединений-это общий пул соединений , основанный на swool, который часто используется в качестве пула соединений с базой данных.

полагаться на

PHP
.2.9 Рекомендую 4.2.13+ Свул

устанавливать

Установите через composer.

composer require "open-smf/connection-pool:~1.0"

Воспользуйся

Еще примеры.

  • Доступные разъемы
Пример Swool\Сопрограммы\MySQL Соединитель MySQL сопрограммы
Экземпляры Swool\Сопрограммы\PostgreSQL, компиляциипараметров необходимо добавлять, когда– включить-сопрограмму-postgresql Соединитель сопрограммы PostgreSQL
Пример Swool\Сопрограммы\Redis Сопрограммный РедисКоннектор
Redis Вам необходимо установить redis Соединитель Php Redis
Ваш интерфейс соединителя должен быть реализован Интерфейс соединителя, любой объект может быть экземпляром соединения Ваш Соединитель
  • Основное Использование
use Smf\ConnectionPool\ConnectionPool;
use Smf\ConnectionPool\Connectors\CoroutineMySQLConnector;
use Swoole\Coroutine\MySQL;

go(function () {
    //MySQL connection number range: [10, 30]
    $pool = new ConnectionPool(
        [
            'minActive'         => 10,
            'maxActive'         => 30,
            'maxWaitTime'       => 5,
            'maxIdleTime'       => 20,
            'idleCheckInterval' => 10,
        ],
        New coroutine MySQL connector // indicates the connector instance. Here, you can use the co process MySQL connector to create a database connection pool for CO process mysql
        [
            'host'        => '127.0.0.1',
            'port'        => '3306',
            'user'        => 'root',
            'password'    => 'xy123456',
            'database'    => 'mysql',
            'timeout'     => 10,
            'charset'     => 'utf8mb4',
            'strict_type' => true,
            'fetch_mode'  => true,
        ]
    );
    Echo "initialize connection pool... \ n";
    $pool->init();
    defer(function () use ($pool) {
        Echo "close connection pool... \ n";
        $pool->close();
    });

    Echo "borrow connection from connection pool... \ n";
    /**@var MySQL $connection */
    $connection = $pool->borrow();
    
    //Execute query statement
    $status = $connection->query('SHOW STATUS LIKE "Threads_connected"');
    
    Echo "return as soon as possible after using up the connection... \ n";
    $pool->return($connection);
    
    var_dump($status);
});
  • Использование на сервере swool
use Smf\ConnectionPool\ConnectionPool;
use Smf\ConnectionPool\ConnectionPoolTrait;
use Smf\ConnectionPool\Connectors\CoroutineMySQLConnector;
use Smf\ConnectionPool\Connectors\PhpRedisConnector;
use Swoole\Coroutine\MySQL;
use Swoole\Http\Request;
use Swoole\Http\Response;
use Swoole\Http\Server;

class HttpServer
{
    use ConnectionPoolTrait;

    protected $swoole;

    public function __construct(string $host, int $port)
    {
        $this->swoole = new Server($host, $port);

        $this->setDefault();
        $this->bindWorkerEvents();
        $this->bindHttpEvent();
    }

    protected function setDefault()
    {
        $this->swoole->set([
            'daemonize'             => false,
            'dispatch_mode'         => 1,
            'max_request'           => 8000,
            'open_tcp_nodelay'      => true,
            'reload_async'          => true,
            'max_wait_time'         => 60,
            'enable_reuse_port'     => true,
            'enable_coroutine'      => true,
            'http_compression'      => false,
            'enable_static_handler' => false,
            'buffer_output_size'    => 4 * 1024 * 1024,
            'worker _num' = > 4, // each worker holds an independent connection pool
        ]);
    }

    protected function bindHttpEvent()
    {
        $this->swoole->on('Request', function (Request $request, Response $response) {
            $pool1 = $this->getConnectionPool('mysql');
            /**@var MySQL $mysql */
            $mysql = $pool1->borrow();
            $status = $mysql->query('SHOW STATUS LIKE "Threads_connected"');
            //Return as soon as possible after using up the connection
            $pool1->return($mysql);


            $pool2 = $this->getConnectionPool('redis');
            /**@var Redis $redis */
            $redis = $pool2->borrow();
            $clients = $redis->info('Clients');
            //Return as soon as possible after using up the connection
           $pool2->return($redis);

            $json = [
                'status'  => $status,
                'clients' => $clients,
            ];
            // Other logic
            // ...
            $response->header('Content-Type', 'application/json');
            $response->end(json_encode($json));
        });
    }

    protected function bindWorkerEvents()
    {
        $createPools = function () {
            //Range of all MySQL connections: [4 workers * 2 = 8, 4 workers * 10 = 40]
            $pool1 = new ConnectionPool(
                [
                    'minActive' => 2,
                    'maxActive' => 10,
                ],
                new CoroutineMySQLConnector,
                [
                    'host'        => '127.0.0.1',
                    'port'        => '3306',
                    'user'        => 'root',
                    'password'    => 'xy123456',
                    'database'    => 'mysql',
                    'timeout'     => 10,
                    'charset'     => 'utf8mb4',
                    'strict_type' => true,
                    'fetch_mode'  => true,
                ]);
            $pool1->init();
            $this->addConnectionPool('mysql', $pool1);

            //Range of all redis connections: [4 workers * 5 = 20, 4 workers * 20 = 80]
            $pool2 = new ConnectionPool(
                [
                    'minActive' => 5,
                    'maxActive' => 20,
                ],
                new PhpRedisConnector,
                [
                    'host'     => '127.0.0.1',
                    'port'     => '6379',
                    'database' => 0,
                    'password' => null,
                ]);
            $pool2->init();
            $this->addConnectionPool('redis', $pool2);
        };
        $closePools = function () {
            $this->closeConnectionPools();
        };
        //Create MySQL and redis connection pool when worker starts
        $this->swoole->on('WorkerStart', $createPools);
        
        //When the worker exits normally or wrongly, close the connection pool and release the connection
        $this->swoole->on('WorkerStop', $closePools);
        $this->swoole->on('WorkerError', $closePools);
    }

    public function start()
    {
        $this->swoole->start();
    }
}

//Enable the collaboration runtime to extend the one key collaboration of phpredis
Swoole\Runtime::enableCoroutine(true);
$server = new HttpServer('0.0.0.0', 5200);
$server->start();
  • Я использовался в производственной среде со стабильной производительностью

вклад

GitHub, добро пожаловать в Star & pr.

Оригинал: “https://developpaper.com/universal-connection-pool-database-connection-pool-based-on-swoole/”