codeigniter可通过environment常量动态切换数据库配置:先替换$active_group赋值为环境判断逻辑,再定义prod/test/dev三组$db配置,最后通过web服务器或cli注入ci_env及db_*环境变量并验证。

在CodeIgniter项目中,需要根据开发、测试、生产环境自动切换数据库配置,避免手动修改database.php导致部署出错或敏感信息泄露。
通过环境变量动态加载数据库配置
第一步:确认CI版本支持ENVIRONMENT常量。CodeIgniter 3.1.11+ 和 CI4 均支持,但CI3需确保index.php中已定义ENVIRONMENT(默认为'development')。
第二步:打开application/config/database.php,找到顶部的$active_group赋值行,将其替换为以下逻辑:
【必须删除原$active_group = 'default';这一行】,否则后续环境判断将失效。
第三步:在$active_group赋值前插入判断代码:
switch (ENVIRONMENT) {<br> case 'production':<br> $active_group = 'prod';<br> break;<br> case 'testing':<br> $active_group = 'test';<br> break;<br> default:<br> $active_group = 'dev';<br>}
这一步操作起来很简单,直接把上面的代码块复制粘贴到database.php开头的注释下方即可,注意不要覆盖原有的$db数组定义。
配置各环境对应的数据库参数组
在同一个database.php文件中,保留原有的$db['default']数组,然后在其下方新增三组配置:
方法一:生产环境组(prod)
$db['prod'] = array(<br> 'hostname' => $_SERVER['DB_HOST'] ?? 'localhost',<br> 'username' => $_SERVER['DB_USER'] ?? '',<br> 'password' => $_SERVER['DB_PASS'] ?? '',<br> 'database' => $_SERVER['DB_NAME'] ?? '',<br> 'dbdriver' => 'mysqli',<br> 'db_debug' => FALSE,<br> 'pconnect' => TRUE<br>);
方法二:测试环境组(test)
$db['test'] = array(<br> 'hostname' => '127.0.0.1',<br> 'username' => 'ci_test',<br> 'password' => 'test123',<br> 'database' => 'ci_test_db',<br> 'dbdriver' => 'mysqli',<br> 'db_debug' => TRUE,<br> 'pconnect' => FALSE<br>);
方法三:开发环境组(dev)
$db['dev'] = array(<br> 'hostname' => 'localhost',<br> 'username' => 'root',<br> 'password' => '',<br> 'database' => 'ci_dev',<br> 'dbdriver' => 'mysqli',<br> 'db_debug' => TRUE,<br> 'pconnect' => FALSE<br>);
注意:$_SERVER变量必须由Web服务器或CLI启动时注入,Apache需用SetEnv,Nginx需用fastcgi_param,Docker则通过environment字段传入——漏掉任一环节都会导致空连接参数。
设置环境变量并验证生效
第一步:修改入口文件index.php顶部的ENVIRONMENT定义,例如设为:define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
第二步:在Web服务器或运行环境中注入对应变量。以Linux CLI为例:
export CI_ENV=production && export DB_HOST=prod-db.example.com && export DB_USER=appuser && export DB_PASS=secret123 && export DB_NAME=app_prod && php index.php
第三步:创建一个临时控制器,输出当前激活的数据库组名:
echo $this->db->hostname . ':' . $this->db->database;
如果输出的是prod-db.example.com:app_prod,说明环境变量已正确加载并生效。











