codeigniter多环境数据库配置分离的核心是通过environment常量自动加载对应环境的database.php文件。推荐在index.php中定义environment,在application/config/下按环境建子目录,各目录内database.php仅含该环境专属$db配置,敏感信息通过$_server读取,主从配置可在同一环境文件中定义,确保隔离与安全。

CodeIgniter 多环境数据库配置分离的核心在于按环境加载不同数据库连接参数,且不硬编码、不混用、不泄露敏感信息。关键不是“写多个配置”,而是让框架自动识别当前运行环境,并加载对应配置组。
环境变量驱动配置分组
CodeIgniter 本身不内置 .env 支持(CI3),但可通过 APPPATH.'config/'.ENVIRONMENT.'/database.php 实现物理隔离。推荐做法是:
- 在
index.php中明确设置ENVIRONMENT常量(如'development'、'testing'、'production') - 创建目录结构:
application/config/development/database.php application/config/production/database.php application/config/testing/database.php
- 每个子目录下的
database.php只定义该环境专用的$db数组,例如:
// application/config/production/database.php
$db['default'] = [
'hostname' => 'prod-db.example.com',
'username' => $_SERVER['DB_USER'] ?? 'prod_user',
'password' => $_SERVER['DB_PASS'] ?? 'prod_pass',
'database' => 'prod_app',
'dbdriver' => 'mysqli',
'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_unicode_ci',
'pconnect' => FALSE,
'db_debug' => FALSE,
'cache_on' => TRUE,
'cachedir' => APPPATH.'cache/db/',
'autoinit' => TRUE,
];
✅ 优势:配置与代码解耦;生产密钥可由系统环境变量注入,避免提交到 Git。
主从读写分离仍走同一套环境逻辑
多环境配置 ≠ 主从配置。主从是连接策略层面的扩展,应在环境配置内部完成,而不是跨环境定义。
例如,在 application/config/production/database.php 中直接定义多个连接组:
// 主库(读写)
$db['master'] = [
'hostname' => 'db-master.internal',
'username' => $_SERVER['DB_MASTER_USER'],
'password' => $_SERVER['DB_MASTER_PASS'],
'database' => 'app_main',
'dbdriver' => 'mysqli',
// ... 其他参数
];
// 从库(只读)
$db['slave'] = [
'hostname' => 'db-slave-01.internal',
'username' => $_SERVER['DB_SLAVE_USER'],
'password' => $_SERVER['DB_SLAVE_PASS'],
'database' => 'app_main',
'dbdriver' => 'mysqli',
// ... 其他参数
];
// 默认组设为从库(读操作默认走 slave)
$active_group = 'slave';
模型中按需切换:
$this->master = $this->load->database('master', TRUE);
$this->slave = $this->load->database('slave', TRUE);
⚠️ 注意:不要在开发环境误配生产主从地址;环境配置文件天然隔离了这种风险。
敏感信息外置与权限控制
数据库密码、host 等绝不写死在 PHP 文件中
推荐方式:通过 Web 服务器(Nginx/Apache)或 CLI 启动时注入环境变量
Linux 下可配合 systemd 或
.bashrc设置,容器部署则用docker run -e DB_USER=...application/config/production/database.php中统一用$_SERVER['XXX']读取,缺失时报错提示而非静默失败确保
application/config/production/目录权限为750,Web 用户不可遍历.gitignore明确排除所有*/database.php(仅保留模板或空占位)
验证与切换机制建议
-
在
MY_Controller或BaseModel中添加辅助方法,快速判断当前环境和活跃数据库组:protected function get_db_info() { return [ 'environment' => ENVIRONMENT, 'active_group' => $this->db->database, 'hostname' => $this->db->hostname, ]; } 开发环境开启
$db['default']['db_debug'] = TRUE,生产环境必须为FALSE部署后执行简单查询(如
SELECT VERSION())验证连接可用性,避免上线才发现配置错误
不复杂但容易忽略。











