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

coldplay.xixi
풀어 주다: 2020-12-25 17:18:16
앞으로
7161명이 탐색했습니다.

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!