codeigniter 默认不自动读取 .env 文件:ci3 完全无内置支持,需手动引入 vlucas/phpdotenv 并用 getenv() 替换配置;ci4 虽默认加载,但仅识别 database.* 键名并映射到 database 配置类属性,且受缓存、拼写、硬编码覆盖等影响。

CodeIgniter 默认不读取 .env 文件,哪怕你把数据库参数全写进去了,框架也完全无视——这是最常被误踩的坑。CI3 完全没有内置环境变量支持;CI4 虽然默认启用 .env,但只自动加载其中以 database. 开头的键(如 database.default.hostname),且仅作用于 app/Config/Database.php 类中对应属性,不会自动映射到传统数组式配置逻辑里。
确认你用的是哪个版本
这直接决定后续操作路径:
-
CI3:
.env文件默认无效,必须手动引入vlucas/phpdotenv并在入口文件(index.php或application/index.php)顶部提前加载,再用getenv()替换配置值 -
CI4:
.env是开箱即用的,但需确保:- 文件位于项目根目录,且无 BOM 编码
- 键名严格匹配 Config 类属性路径,例如
database.default.port对应Database::$default['port'] - 没有拼写错误或大小写混淆(如
DB_HOST≠database.default.hostname)
CI3 中让 .env 生效的硬核步骤
不能只放文件,得“接上电”:
- 用 Composer 安装:
composer require vlucas/phpdotenv - 编辑
index.php(或application/index.php),在require_once 'system/core/CodeIgniter.php';之前加入:
- 然后打开
application/config/database.php,把静态值替换成getenv()调用,例如:
$db['default']['database'] = getenv('DB_NAME') ?: 'myapp';
- 注意:不要用
env()(那是 ThinkPHP 的函数),CI3 没这个东西
CI4 中 .env 配置不生效的典型原因
不是没读,而是读了但没对上号:
-
.env里的database.default.hostname=localhost只会影响app/Config/Database.php中$default['hostname']属性;如果你在控制器里还手动 new 了一个数据库组,它不会自动继承 - 多数据库切换时(比如
test组),.env必须显式写全路径:database.test.hostname=127.0.0.1,不能只靠复制 default 段落 - 修改
.env后,若启用了配置缓存(php spark cache:clear不清配置缓存),需运行php spark config:clear才能刷新 - 检查
app/Config/Database.php是否覆盖了.env值——比如某行写了$this->default['hostname'] = 'hardcoded';,就会把环境变量顶掉
验证是否真生效的快捷方式
别猜,直接看结果:
- CI3:在控制器里加
var_dump(getenv('DB_NAME'));,输出 null 就说明.env没加载成功 - CI4:在任意控制器中执行
print_r(config('Database')->default);,看输出的 hostname、database 等字段是否是你在.env里写的值 - 连接失败时,打开
app/Config/Database.php,确认$default数组最终合并结果是否含预期值,而不是空字符串或默认 localhost











