codeigniter 的环境配置依赖 environment 常量在 index.php 开头定义,仅支持 development/testing/production 三值;.env 仅在前两者自动加载,路径须为根目录且值需单引号包裹;cli 下需确保走标准入口或显式定义常量。

CodeIgniter 的环境变量不是靠 .env 文件“自动生效”的,而是由框架启动时读取常量 ENVIRONMENT 决定配置加载路径;.env 文件是否被加载、加载哪些键,完全取决于当前 ENVIRONMENT 值和你是否手动触发 DotEnv 加载逻辑。
ENVIRONMENT 常量必须在 index.php 最开头定义
这是所有环境切换的前提,晚了就彻底失效。CI4 会在 system/Boot.php 里检查 ENVIRONMENT 是否已定义,一旦错过这个时机,后续任何修改(比如在中间件或控制器里 define())都无效。
-
ENVIRONMENT只能是'development'、'testing'或'production'三者之一;传入'staging'或'local'会被当作'production' - 必须紧接
<?php后写,且早于所有require、include和autoload.php加载 - Apache 的
SetEnv CI_ENVIRONMENT development或 Nginx 的fastcgi_param CI_ENVIRONMENT development不会自动映射为 PHP 常量,CI4 不读$_SERVER['CI_ENVIRONMENT']来定义它——只用来 fallback
app/Config/{EnvName}/ 下的配置文件优先级规则
CI4 按照固定路径查找配置:先找 app/Config/production/Database.php,找不到就回退到 app/Config/Database.php,但仅限该单个文件,不会整目录降级。
- 路径名必须与
ENVIRONMENT值**完全一致且区分大小写**:Linux 下app/Config/Production/≠app/Config/production/ -
app/Config/Boot/目录下的文件(如development.php)**不按环境自动加载**,它们是无条件执行的引导配置,需手动判断ENVIRONMENT后require -
app/Config/Services.php同样不支持环境子目录,如需差异化服务注册,得在文件内用if (ENVIRONMENT === 'development')分支处理
.env 文件只在 development/testing 下自动加载
CI4 默认只在 APP_ENV=development 或 APP_ENV=testing 时调用 DotEnv 加载器;设成 APP_ENV=production,.env 就被跳过——这不是 bug,是安全设计。
-
.env必须放在项目根目录(与public/、app/同级),路径错位会导致静默失败 - 值中含
#、$、空格或{等字符时,env('DB_PASSWORD')极易返回null;正确写法是DB_PASSWORD='my@pass#123'(单引号包裹,等号无空格) - 修改
.env后必须清空writable/cache/和writable/logs/,否则旧缓存可能掩盖新值
CLI 模式下环境配置容易被忽略的点
运行 php spark 时,默认走的是 spark 脚本自己的入口逻辑,不经过你的 public/index.php,因此你在里面定义的 ENVIRONMENT 完全不生效。
- CLI 下应显式调用
php public/index.php spark,确保走标准入口 - 若用
php spark,需在spark文件顶部补上define('ENVIRONMENT', 'development');(但更推荐前者) - CLI 下
FCPATH默认是当前工作目录,不是 Web 入口目录,可能导致APPPATH解析错误;可在index.php开头加if (php_sapi_name() === 'cli') { define('FCPATH', __DIR__ . '/'); }强制修正
环境配置最脆弱的地方不在语法,而在加载顺序和作用域:常量定义时机、文件路径拼写、CLI 入口选择、.env 解析边界——这些地方一错,现象就是“改了没反应”,而报错信息往往藏在日志深处,甚至根本不报。











