codeigniter 4 不支持原生数据库连接池配置,其 database 类无内置连接池机制,database.php 中的 'pconnect'、'pooling' 等配置均无效,仅在单请求内复用一个 pdo 实例。

CodeIgniter 4 不支持原生数据库连接池配置
CodeIgniter 4 的 Database 类本身没有内置连接池机制,database.php 中所有配置项(如 'pconnect' => true、'pooling' => true)均无效。所谓“连接池”在 CI4 中仅体现为每次请求复用单个 PDO 实例,而非多连接复用管理。
为什么不能在 database.php 里配 connection pool size
CI4 的数据库驱动(PDOConnection)不维护连接队列或空闲连接缓存;它只在第一次调用 $this->db 时创建一个连接,并在整个请求生命周期内复用。这意味着:
-
'pconnect' => true在 PHP-FPM 下不仅无效,还可能引发状态污染和连接泄漏 - 不存在
max_pool_size、min_idle等配置项——这些字段填了也不会被读取或生效 - 试图添加自定义选项如
'options' => [PDO::ATTR_PERSISTENT => true]属于危险操作,官方明确不推荐
真要控制并发连接数,得从 PHP-FPM 和 MySQL 层下手
实际连接数上限由运行环境决定,不是框架能配置的:
- PHP-FPM 的
pm.max_children值直接决定最多多少个并发连接(每个 worker 进程持有一个 DB 连接) - MySQL 的
max_connections必须 ≥ PHP-FPM 最大子进程数,否则必然报Too Many Connections - CLI 模式下若需长连接复用(如定时任务),应手动管理:用
try/catch包裹查询,并在脚本末尾显式unset($this->db)或调用$this->db->close() - 云数据库(如阿里云 RDS)默认
wait_timeout=300,需在 CI4 的数据库配置中加'options' => [PDO::ATTR_TIMEOUT => 5]避免空闲连接被服务端断开后复用失败
替代方案:用 Swoole + Hyperf/Database 实现真连接池
若项目已迁移到 Swoole 环境(如使用 Hyperf),才值得引入连接池。此时应完全绕过 CI4 的 DB 类,改用:
-
Hyperf\Database\Pool\MySqlPool配置min_connections、max_connections - 通过
make(MySqlPool::class)获取连接,不再依赖 CI4 的自动加载机制 - CI4 与 Swoole 共存时,必须隔离数据库访问路径——Web 请求走 CI4 默认连接,协程任务走独立池
这个边界容易被忽略:同一个应用里混用两种连接管理方式,会导致连接泄漏、事务失效、时区错乱等静默问题。











