>PHP 프레임워크 >Swoole >swoole 기반의 mysql 연결 풀 구현에 대한 자세한 설명

swoole 기반의 mysql 연결 풀 구현에 대한 자세한 설명

coldplay.xixi
coldplay.xixi앞으로
2020-12-25 17:18:167228검색

swoole 프레임워크이 칼럼에서는 swoole이 mysql 연결 풀을 구현하는 방법을 소개합니다

swoole 기반의 mysql 연결 풀 구현에 대한 자세한 설명

권장(무료): swoole 프레임워크

서문

모든 작업자 요청 FPM은 mysql에 한 번 연결한 후 요청이 완료된 후 연결이 끊어집니다. 동시성이 작은 애플리케이션의 경우 문제가 되지 않지만 동시성이 높은 애플리케이션의 경우 연결이 자주 설정되고 연결이 끊어지면 데이터베이스에 병목 현상이 발생할 수 있습니다. 오류를 보고합니다.

연결 풀의 장점

연결 풀은 긴 연결 모드를 채택하여 항상 MySQL과의 연결을 유지합니다. 사용 후에는 다시 연결 풀에 저장되므로 연결 설정 및 연결 해제에 소요되는 비용이 절약됩니다. 이는 시스템 IO 소비를 크게 줄이고 프로그램 동시성 성능을 어느 정도 향상시킵니다. 연결 풀이 비어 있으면 연결 풀에서 연결이 할당되고, 그렇지 않으면 요청이 대기 대기열에 추가됩니다.

구현

Swoole을 사용하여 mysql 연결 풀을 구현합니다

연결 풀 클래스
<?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();
    }}
데이터베이스 DB 클래스
<?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;
    }}
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();});
출처 코드 주소 swoole-mysql-pool

관련 무료 학습 권장사항: mysql 비디오 튜토리얼

위 내용은 swoole 기반의 mysql 연결 풀 구현에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제