codeigniter中开启pconnect需在database.php设'pconnect' => true,但多库同实例时必须关闭以避免事务错乱;其生命周期绑定php-fpm worker进程,复用连接节省tcp开销。

怎么在 CodeIgniter 中开启 pconnect
只需在 database.php 配置文件中,对应数据库组里把 'pconnect' => TRUE 即可:
$db['default']['pconnect'] = TRUE;
这是 CI3 的写法;CI4 中默认不暴露该选项,需在 app/Config/Database.php 的数据库配置数组中手动添加:
'DBPConnect' => true,
pconnect 实际生效的条件
不是设成 TRUE 就一定走持久连接,还依赖以下几点:
- PHP 扩展支持:MySQLi 或 PDO 必须启用,且 Web 服务器(如 PHP-FPM)运行模式要允许连接复用
- 连接参数完全一致:主机、端口、用户名、密码、数据库名全部相同,才会复用已有连接
- CI3 默认使用
mysqli驱动时,pconnect会调用mysqli_pconnect();若用pdo驱动,则自动注入PDO::ATTR_PERSISTENT => true
多数据库场景下必须关掉 pconnect
如果你用了多个数据库组(比如 default 和 second_db),且它们连的是同一个 MySQL 实例(同 host/port/user),务必把每个组的 pconnect 都设为 FALSE。
原因:CI 会复用底层 mysqli 连接资源,导致事务错乱——例如在 A 库 start_transaction(),commit 却发给了 B 库的连接句柄,直接报错:
mysqli_sql_exception: COMMIT is not allowed when implicit autocommit is enabled
解决办法就是显式隔离:
$db['default']['pconnect'] = FALSE;<br>$db['second_db']['pconnect'] = FALSE;
pconnect 的真实生命周期
它和 PHP-FPM worker 进程绑定:
- 连接在 worker 启动时创建,worker 退出(如重启或超时)时才真正关闭
- 单个请求中多次调用
$this->db->...不会新建连接,复用已有的 -
$this->db->close()并不会断开持久连接,只是让当前脚本不能再用它;连接仍在后台存活,下次请求还会被重用
所以它节省的是“建立 TCP + 认证 + 初始化连接”的开销,适合高并发短请求场景,但不适合长事务或连接状态敏感的操作。











