php实现数据库连接池
PHP 实现数据库连接池的方法
PHP 本身是脚本语言,传统模式下每个请求结束后会释放所有资源,包括数据库连接。要实现连接池,需借助外部工具或特定扩展。以下是几种实现方式:
使用 Swoole 扩展
Swoole 作为 PHP 的协程高性能网络引擎,内置连接池功能:
$pool = new Swoole\Database\PDOPool(
(new Swoole\Database\PDOConfig())
->withHost('127.0.0.1')
->withPort(3306)
->withDbName('test')
->withCharset('utf8mb4')
->withUsername('root')
->withPassword('password'),
16 // 连接池大小
);
$pdo = $pool->get();
$statement = $pdo->query('SELECT * FROM users');
$result = $statement->fetchAll();
$pool->put($pdo);
需注意:

- 仅适用于 Swoole 常驻内存环境
- 连接池大小需根据服务器配置调整
使用 PDO 持久连接
PDO 支持持久化连接,虽非严格连接池,但可复用连接:
$dbh = new PDO(
'mysql:host=localhost;dbname=test',
'user',
'pass',
[PDO::ATTR_PERSISTENT => true]
);
特性:

- 相同进程内的多个请求会复用连接
- Apache/Nginx 等环境下需配合进程管理
中间件方案
通过外部中间件实现连接池:
- 使用 pgbouncer(PostgreSQL)
- 使用 ProxySQL(MySQL)
- 使用 HAProxy 配合 TCP 模式
配置示例(ProxySQL):
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'127.0.0.1',3306);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
手写简易连接池(CLI 模式)
适用于命令行长期运行的脚本:
class ConnectionPool {
private $pool;
private $config;
public function __construct($config, $size) {
$this->config = $config;
$this->pool = new SplQueue;
for ($i = 0; $i < $size; $i++) {
$this->pool->enqueue($this->createConnection());
}
}
private function createConnection() {
return new PDO(...$this->config);
}
public function get() {
if ($this->pool->isEmpty()) {
return $this->createConnection();
}
return $this->pool->dequeue();
}
public function put($conn) {
$this->pool->enqueue($conn);
}
}
关键注意事项
- 连接泄漏:必须确保使用后归还连接
- 事务状态:连接归还前需回滚未提交事务
- 心跳机制:长时间空闲连接需要验证有效性
- 并发控制:多线程/协程环境需加锁处理
性能优化建议
- 监控连接等待时间调整池大小
- 不同业务使用独立连接池避免相互影响
- 设置连接最大生命周期定期重建
对于 Web 应用,推荐优先考虑 Swoole 或中间件方案。传统 PHP-FPM 模式下,持久连接配合 OPcache 也能显著提升性能。






