CodeIgniter 4 已移除对传统数据库长连接的支持,pconnect 参数完全失效;连接复用取决于运行模式(如 Swoole/CLI 可复用,PHP-FPM 不可),应优先优化查询、缓存和模型配置。

CodeIgniter 4 默认不启用数据库长连接(persistent connection),直接设 pconnect = TRUE 不起作用 —— 因为 CI4 已移除对传统 MySQL 持久连接的支持,改用 PDO 连接池机制,而 PDO 本身不提供真正的“长连接复用”,所谓“长连接”在 CI4 中实际依赖底层驱动行为和 Web 服务器模型。
CI4 的 pconnect 参数已失效
你在 app/Config/Database.php 里看到的 'pconnect' => TRUE 配置项,在 CI4 中完全被忽略。框架源码中已删除对该参数的读取逻辑,无论你设成 TRUE 还是 FALSE,都不会影响连接行为。
- CI4 使用
PDO或MySQLi驱动,但连接生命周期由 PHP-FPM 进程或 Swoole/Worker 生命周期决定,不是框架控制 -
mysqli_pconnect()在 PHP 8.0+ 中已被废弃,CI4 为兼容性彻底弃用该路径 - 试图在配置里保留
pconnect只会制造误导,建议直接删掉这一行
真正影响连接复用的是 Web 服务器 + PHP 运行模式
能否复用数据库连接,取决于请求是否落在同一个 PHP 进程内:
- PHP-FPM + Apache/Nginx:每个请求由独立 FPM worker 处理,连接在请求结束时自动关闭 —— 无连接复用
- Swoole / RoadRunner:常驻内存模型,PDO 连接可跨请求复用(需手动管理)
- CLI 模式(如队列任务):单进程长时运行,连接可复用,但要注意连接超时和断连重试
所以,与其调 pconnect,不如确认你用的是哪种部署方式。如果是标准 FPM,那“长连接”本身就是伪命题 —— 你真正该做的是连接池或连接复用策略。
替代方案:用 ConnectionPool 或手动复用 PDO 实例
CI4 不内置连接池,但你可以通过服务层实现轻量级复用:
- 在
app/Services.php中注册一个共享数据库连接服务:public static function dbShared() { static $instance = null; if ($instance === null) { $db = \Config\Database::connect(); // 确保连接有效(可选) if (!$db->connID || $db->connID->ping() === false) { $db->reconnect(); } $instance = $db; } return $instance; } - 在控制器中调用:
$db = service('dbShared');,避免每次\Config\Database::connect() - 注意:该方式仅适用于 CLI 或常驻进程;FPM 下因进程隔离,
static不跨请求生效,实际无效
高并发下更有效的优化点其实不在连接层
盲目追求“长连接”容易掩盖真实瓶颈。CI4 应用在高并发下卡顿,90% 情况出在以下环节:
- 未关闭
save_queries(尤其在调试开启时,会把所有 SQL 存进数组导致内存爆炸) - 模型未设置
$allowedFields,导致update()时触发全字段扫描或安全拦截 - 视图中隐式调用数据库(如
$this->db->table()->get()),引发 N+1 查询 - 未使用查询缓存(
cache()方法或 Redis 集成)处理高频只读数据
真正提升并发性能,优先检查这些地方 —— 它们带来的收益远大于纠结“长连接”是否存在。



















