CodeIgniter 4 支持多数据库连接,通过 .env 文件按组名(如 default、slave)定义完整配置,代码中调用 Config\Database::connect('组名') 获取对应 ConnectionInterface 实例,实现读写分离等场景。

CodeIgniter 4 支持同时配置多个数据库连接,不需要额外扩展或手动写连接管理类。核心方式是通过 .env 文件定义不同连接组,再在代码中按需加载指定组。
在 .env 中定义多个数据库组
CI4 使用键名分组管理数据库配置,格式为 database.[组名].[配置项]。默认组是 default,你可以自由添加其他组,比如 slave、analytics 或 legacy:
database.default.hostname = "localhost"database.default.database = "main_db"database.default.username = "app_user"database.default.password = "secret123"database.default.DBDriver = "MySQLi"database.slave.hostname = "192.168.1.100"database.slave.database = "main_db"database.slave.username = "readonly_user"database.slave.password = "ro_pass"database.slave.DBDriver = "MySQLi"
注意:所有组必须显式声明完整参数,不能继承 default 的值;组名区分大小写,且不能含特殊字符或空格。
在控制器或模型中使用指定数据库组
调用 Database 服务时传入组名即可获取对应连接实例:
-
$db_default = \Config\Database::connect();→ 加载 default 组(等价于connect('default')) -
$db_slave = \Config\Database::connect('slave');→ 加载 slave 组 $db_analytics = \Config\Database::connect('analytics');
返回的对象是完整的 CodeIgniter\Database\ConnectionInterface 实例,支持全部查询方法(table()、get()、query() 等)。
读写分离的简易实践方式
虽然 CI4 不内置读写分离路由逻辑,但你可以封装一个轻量工具类或在基础模型中约定行为:
- 写操作统一用
\Config\Database::connect()(即 default,通常指向主库) - 读操作按需调用
\Config\Database::connect('slave'),例如统计报表、列表页等高并发只读场景 - 避免在事务中混用多连接;事务只能绑定单个连接实例
- 如需自动切换,可在
app/Config/Services.php中注册自定义数据库工厂,根据方法类型动态选择组
验证与调试建议
部署后务必确认连接可用:
- 检查
writable/logs/下的错误日志,看是否有“Connection refused”或认证失败提示 - 用原生 PHP 写个测试脚本,直连相同账号密码,排除数据库服务或权限问题
- cPanel 或云主机环境注意:数据库名/用户名常带前缀(如
user_main_db),不能照搬本地配置 - 确保目标数据库用户已被授权访问对应库(cPanel 中需在「MySQL Databases」页面手动关联并赋权)


















