php实现数据库连接池
PHP 实现数据库连接池的方法
PHP 本身没有内置的数据库连接池功能,但可以通过多种方式实现类似效果。以下是几种常见的方法:
使用 PDO 持久连接
PDO 支持持久连接,可以在多个请求之间保持连接不关闭:
$dsn = 'mysql:host=localhost;dbname=test';
$options = [
PDO::ATTR_PERSISTENT => true
];
$db = new PDO($dsn, $username, $password, $options);
持久连接会在脚本结束后保持打开状态,下次请求可以复用。需要注意并发连接数限制。
使用 Swoole 扩展
Swoole 提供了内置的连接池功能:
$pool = new Swoole\ConnectionPool(
function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
},
100 // 连接池大小
);
$db = $pool->get();
// 使用连接
$pool->put($db);
Swoole 的连接池适合长生命周期应用,如常驻内存的 CLI 或 Swoole HTTP 服务器。
使用第三方库
一些 PHP 库提供了连接池实现,例如:
- php-pool/pool
- spatie/laravel-pool (Laravel 专用)
安装示例:
composer require php-pool/pool
使用示例:
$pool = new PhpPool\Pool(
function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
},
['max' => 20]
);
$connection = $pool->get();
// 使用连接
$pool->release($connection);
实现自定义连接池
可以自行实现简单的连接池:
class ConnectionPool {
private $pool = [];
private $maxSize;
public function __construct($maxSize = 10) {
$this->maxSize = $maxSize;
}
public function get() {
if (!empty($this->pool)) {
return array_pop($this->pool);
}
if (count($this->pool) < $this->maxSize) {
return $this->createConnection();
}
throw new RuntimeException('Connection pool exhausted');
}
public function release($connection) {
if (count($this->pool) < $this->maxSize) {
$this->pool[] = $connection;
}
}
private function createConnection() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
}
}
注意事项
- PHP 传统模式下(FPM/CGI)每个请求都是独立进程,连接池需要在请求间共享状态,通常需要外部存储如Redis
- 连接池大小应根据数据库服务器配置和业务负载调整
- 长连接可能导致数据库连接数积累,需设置合理的超时和回收机制
- 事务处理需要确保连接释放前完成或回滚
以上方法可根据具体应用场景选择,Swoole方案适合高性能场景,PDO持久连接适合简单应用,第三方库提供折中方案。







