本文目录导读:

在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, // 启用持久连接
],
],
],
建议与注意事项
- 生产环境推荐:使用 Swoole 或 Hyperf 的连接池
- 连接池大小:一般设置为
CPU核心数 * 2 + 1 - 心跳检测:定期检查连接有效性,避免使用已断开的连接
- 超时设置:合理设置连接超时和等待超时
- 监控:监控连接池的使用情况,避免连接泄漏
选择哪种方式主要取决于你的项目框架和环境需求,对于新项目,推荐使用 Swoole 或 Hyperf;对于现有项目,可以考虑手动实现简单的连接池。