当前位置:首页 > PHP

php实现数据库连接池

2026-02-14 06:11:43PHP

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 等环境下需配合进程管理

中间件方案

通过外部中间件实现连接池:

  1. 使用 pgbouncer(PostgreSQL)
  2. 使用 ProxySQL(MySQL)
  3. 使用 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 模式)

适用于命令行长期运行的脚本:

php实现数据库连接池

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 也能显著提升性能。

分享给朋友:

相关文章

react如何上传图片到数据库

react如何上传图片到数据库

上传图片到数据库的流程 在React中上传图片到数据库通常涉及前端处理文件上传、后端接收文件并存储到数据库的过程。以下是具体实现方法: 前端实现(React部分) 创建一个文件上传表单组件: im…

php实现数据库备份

php实现数据库备份

使用 mysqldump 命令 在 PHP 中调用系统命令 mysqldump 是最常见的数据库备份方法。该方法适用于 MySQL 或 MariaDB 数据库。 $dbHost = 'localho…

js实现数据库操作

js实现数据库操作

JavaScript 实现数据库操作的方法 JavaScript 可以通过多种方式操作数据库,包括浏览器端的本地存储、服务器端的数据库连接以及使用 ORM 框架等。以下是几种常见的实现方法: 浏览器…

java如何访问数据库

java如何访问数据库

使用JDBC连接数据库 JDBC(Java Database Connectivity)是Java标准库提供的数据库访问接口,支持多种关系型数据库。以下是基本操作步骤: 加载驱动 根据数据库类型加…

java如何连接access数据库

java如何连接access数据库

使用JDBC-ODBC桥连接Access数据库 在Java中连接Access数据库可以通过JDBC-ODBC桥实现,以下是具体步骤: 确保系统已安装Microsoft Access数据库和相应的OD…

java如何调用数据库

java如何调用数据库

使用JDBC连接数据库 JDBC(Java Database Connectivity)是Java连接数据库的标准API。通过JDBC可以执行SQL语句并处理结果。 加载数据库驱动,例如MySQL:…