CodeIgniter 多环境数据库配置需通过 index.php 定义 ENVIRONMENT 常量,并在 database.php 中用 switch 按环境加载对应参数;CI4 更推荐使用 .env 文件配合 DotEnv 加载,且须清除缓存生效。

CodeIgniter 项目要支持不同环境(开发、测试、生产)下的数据库参数,核心不是靠写死在 database.php 里,而是利用框架对环境变量的识别机制 + 配置文件分层加载。硬编码多套配置或手动改文件,上线时极易出错。
如何让 CodeIgniter 自动识别当前运行环境
CI3 和 CI4 的环境识别逻辑不同,但都依赖一个关键入口点:index.php。你必须在这里显式定义 ENVIRONMENT 常量:
- CI3:默认已有三行判断(
development/testing/production),只需确保ENVIRONMENT被正确定义,且值匹配其中之一 - CI4:同样靠
index.php中的define('ENVIRONMENT', 'production');,但更推荐配合.env文件使用(需启用DotEnv加载) - 服务器上若用 Apache,可通过
SetEnv在虚拟主机或.htaccess中设置环境变量,但优先级低于index.php中的硬编码定义
database.php 中怎么写才能适配多环境
直接在 application/config/database.php 里用条件判断切换配置,是最轻量、最可靠的做法(CI3 推荐;CI4 可用但更倾向 .env):
$active_group = 'default';
$query_builder = TRUE;
switch (ENVIRONMENT)
{
case 'development':
$db['default'] = array(
'hostname' => 'localhost',
'username' => 'dev_user',
'password' => 'dev_pass',
'database' => 'dev_db',
'dbdriver' => 'mysqli',
'db_debug' => TRUE,
'save_queries' => TRUE
);
break;
case 'testing':
$db['default'] = array(
'hostname' => '10.0.2.10',
'username' => 'test_user',
'password' => 'test_pass',
'database' => 'test_db',
'dbdriver' => 'mysqli',
'db_debug' => FALSE,
'save_queries' => FALSE
);
break;
case 'production':
$db['default'] = array(
'hostname' => 'prod-db.internal',
'username' => 'prod_user',
'password' => $_SERVER['DB_PASSWORD'] ?? '',
'database' => 'prod_db',
'dbdriver' => 'mysqli',
'db_debug' => FALSE,
'save_queries' => FALSE
);
break;
default:
exit('The application environment is not set correctly.');
}
- 务必检查
ENVIRONMENT值是否与switch中的 case 完全一致(大小写敏感) - 生产环境避免明文密码,建议从
$_SERVER或getenv()读取,而非写死在文件里 -
db_debug和save_queries在生产环境必须关掉,否则严重拖慢性能甚至暴露敏感信息
CI4 中更现代的做法:用 .env 文件管理数据库参数
CI4 原生支持 DotEnv,比修改 PHP 配置文件更安全、更符合十二要素应用原则:
- 在项目根目录创建
.env文件,并确保它**不提交到 Git**(加入.gitignore) - 内容示例(注意等号前后不能有空格):
database.default.hostname = localhostdatabase.default.username = ci4_devdatabase.default.password = secret123database.default.database = ci4_dev_db - 确认
app/Config/Database.php中的构造函数已启用$this->loadEnvironment();(CI4.3+ 默认已启用) - 环境变量名必须严格匹配配置类中定义的键路径,比如
database.default.hostname对应$this->default->hostname
真正容易被忽略的是:环境切换后,别忘了清空 app/Cache/ 下的配置缓存(CI3)或 writable/cache/(CI4),否则旧配置仍可能生效。另外,任何通过 $this->load->database() 动态加载的连接,都不会自动继承环境判断逻辑——它只认你传进去的数组,所以动态连接仍需你自己做环境分支处理。


















