권장(무료): 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['pool_size']; $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(); }}
<?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; }}
<?php require_once "MysqlPool.php";\Co\run(function () { $server = new \Co\Http\Server("0.0.0.0", 9501, false); $pool = MysqlPool::getInstance([ 'pool_size'=>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();});
관련 무료 학습 권장사항: mysql 비디오 튜토리얼
위 내용은 swoole 기반의 mysql 연결 풀 구현에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!