PHP数据库连接池怎么配置

wen PHP项目 1

本文目录导读:

PHP数据库连接池怎么配置

  1. Swoole 连接池(推荐)
  2. Hyperf 框架连接池
  3. Workerman 连接池
  4. PHP-PM 连接池
  5. 手动实现简单连接池
  6. 使用 Laravel 的数据库连接池
  7. 建议与注意事项

在PHP中配置数据库连接池,主要有以下几种方式,我会从简单到复杂为你介绍:

Swoole 连接池(推荐)

Swoole 提供了内置的连接池支持,是最常用的方案:

安装 Swoole

pecl install swoole

配置连接池

<?php
use Swoole\Database\PDOPool;
use Swoole\Database\PDOConfig;
// 创建连接池配置
$pool = new PDOPool(
    (new PDOConfig())
        ->withHost('127.0.0.1')
        ->withPort(3306)
        ->withDbName('test')
        ->withCharset('utf8mb4')
        ->withUsername('root')
        ->withPassword('password')
        ->withOptions([
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]),
    $size = 10  // 连接池大小
);
// 使用连接
$conn = $pool->get();
try {
    $stmt = $conn->query('SELECT * FROM users');
    $result = $stmt->fetchAll();
} finally {
    $pool->put($conn);  // 归还连接
}

Hyperf 框架连接池

如果你使用 Hyperf 框架,配置更简单:

配置文件 config/autoload/databases.php

<?php
return [
    'default' => [
        'driver' => 'pdo',
        'host' => '127.0.0.1',
        'port' => 3306,
        'database' => 'test',
        'username' => 'root',
        'password' => 'password',
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'pool' => [
            'min_connections' => 5,      // 最小连接数
            'max_connections' => 30,     // 最大连接数
            'connect_timeout' => 10,     // 连接超时
            'wait_timeout' => 3,         // 等待超时
            'heartbeat' => -1,           // 心跳检测
            'max_idle_time' => 60,       // 最大空闲时间
        ],
        'options' => [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ],
    ],
];

Workerman 连接池

使用 Workerman 的 MySQL 连接池

<?php
use Workerman\MySQL\Connection;
use Workerman\Worker;
$worker = new Worker('tcp://0.0.0.0:1234');
$worker->count = 4;
// 配置连接池
$worker->onWorkerStart = function() {
    global $dbPool;
    $dbPool = new \Workerman\MySQL\Pool(
        '127.0.0.1',
        '3306',
        'root',
        'password',
        'test',
        [
            'min_connections' => 2,
            'max_connections' => 10,
            'wait_timeout' => 5
        ]
    );
};
// 使用连接
$worker->onMessage = function($connection, $data) {
    global $dbPool;
    $db = $dbPool->getConnection();
    $result = $db->query('SELECT * FROM users');
    $connection->send(json_encode($result));
    // 归还连接
    $dbPool->release($db);
};

PHP-PM 连接池

PHP-PM 是一个 PHP 进程管理器,支持连接池:

安装

composer require php-pm/php-pm

配置文件 ppm.json

{
    "bridge": "PdoBridge",
    "host": "127.0.0.1",
    "port": 8080,
    "workers": 4,
    "concurrency": 100,
    "database": {
        "host": "127.0.0.1",
        "port": 3306,
        "database": "test",
        "username": "root",
        "password": "password",
        "charset": "utf8mb4",
        "pool_size": 10
    }
}

手动实现简单连接池

如果你不想使用框架,可以自己实现:

<?php
class ConnectionPool {
    private $pool = [];
    private $maxSize;
    private $config;
    public function __construct($config, $maxSize = 10) {
        $this->config = $config;
        $this->maxSize = $maxSize;
    }
    public function getConnection() {
        if (!empty($this->pool)) {
            return array_pop($this->pool);
        }
        if (count($this->pool) < $this->maxSize) {
            return $this->createConnection();
        }
        throw new \Exception("Connection pool exhausted");
    }
    public function releaseConnection($connection) {
        if (count($this->pool) < $this->maxSize) {
            $this->pool[] = $connection;
        } else {
            $this->closeConnection($connection);
        }
    }
    private function createConnection() {
        return new PDO(
            "mysql:host={$this->config['host']};port={$this->config['port']};dbname={$this->config['database']};charset={$this->config['charset']}",
            $this->config['username'],
            $this->config['password'],
            $this->config['options'] ?? []
        );
    }
    private function closeConnection($connection) {
        $connection = null;
    }
    public function __destruct() {
        foreach ($this->pool as $connection) {
            $this->closeConnection($connection);
        }
        $this->pool = [];
    }
}
// 使用
$config = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'database' => 'test',
    'username' => 'root',
    'password' => 'password',
    'charset' => 'utf8mb4',
];
$pool = new ConnectionPool($config, 10);
$conn = $pool->getConnection();
// 使用连接...
$pool->releaseConnection($conn);

使用 Laravel 的数据库连接池

Laravel 默认使用持久连接,但可以通过配置实现连接池:

config/database.php

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
        'options' => [
            PDO::ATTR_PERSISTENT => true,  // 启用持久连接
        ],
    ],
],

建议与注意事项

  1. 生产环境推荐:使用 Swoole 或 Hyperf 的连接池
  2. 连接池大小:一般设置为 CPU核心数 * 2 + 1
  3. 心跳检测:定期检查连接有效性,避免使用已断开的连接
  4. 超时设置:合理设置连接超时和等待超时
  5. 监控:监控连接池的使用情况,避免连接泄漏

选择哪种方式主要取决于你的项目框架和环境需求,对于新项目,推荐使用 Swoole 或 Hyperf;对于现有项目,可以考虑手动实现简单的连接池。

抱歉,评论功能暂时关闭!