codeigniter 3需手动通过environment常量区分开发与生产数据库配置:在web服务器或cli中设置ci_env,入口文件定义该常量,并在database.php中用switch按环境加载对应参数,密码须从$_server读取,db_debug生产环境必须为false。

CodeIgniter 3(CI3)本身不内置多环境自动切换机制,区分 development 和 production 数据库配置需手动控制配置加载逻辑,核心在于:通过 PHP 环境变量或服务器配置决定使用哪一套数据库参数,而非靠 CI3 自动识别。
以下是实际可行、生产可用的区分方式:
明确设置 PHP 环境标识
在 Web 服务器(如 Apache/Nginx)或 CLI 启动时,显式设定 ENVIRONMENT 常量。这是 CI3 官方推荐方式:
- Apache(.htaccess 或 vhost)中添加:
SetEnv CI_ENV development
- Nginx(server 块)中添加:
fastcgi_param CI_ENV production;
- CLI 运行时(如部署脚本):
CI_ENV=production php index.php welcome
CI3 入口文件 index.php 会读取该值并定义常量:
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
后续所有配置加载都以此为依据。
在 database.php 中按环境分支写配置
不要写两套独立文件,而是在 application/config/database.php 内用条件判断:
switch (ENVIRONMENT) {
case 'development':
$db['default'] = [
'hostname' => '127.0.0.1',
'username' => 'dev_user',
'password' => 'dev_pass',
'database' => 'myapp_dev',
'db_debug' => TRUE,
'char_set' => 'utf8mb4',
];
break;
case 'production':
$db['default'] = [
'hostname' => 'prod-db.internal',
'username' => 'prod_app',
'password' => $_SERVER['DB_PASSWORD'] ?? '', // 推荐从环境变量读取密码
'database' => 'myapp_prod',
'db_debug' => FALSE,
'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_unicode_ci',
];
break;
default:
show_error('Unknown environment: ' . ENVIRONMENT);
}
关键细节必须注意
-
密码不硬编码:生产环境密码应通过服务器环境变量(如
$_SERVER['DB_PASSWORD'])注入,避免泄露在代码中; -
主机名别用
localhost:尤其 MySQL 8+ 或 Docker 场景下,localhost触发 socket 连接,而127.0.0.1才走 TCP,开发/生产网络路径要一致; -
权限最小化:
development账号可赋予ALL PRIVILEGES,production账号只给SELECT, INSERT, UPDATE, DELETE,禁用DROP,CREATE; -
db_debug必须关:生产环境务必设为FALSE,否则 SQL 错误会暴露表结构、路径等敏感信息; -
字符集统一声明:开发与生产都显式指定
utf8mb4和对应 collation,避免因默认值差异导致乱码或索引失效。
这样配置后,同一份 database.php 文件在不同服务器上运行时,自动加载对应环境的连接参数,无需复制文件、也不依赖外部配置中心。











