CI4的.env配置不生效是因为文件位置错误、DotEnv未加载、语法不合规、缓存未清除或系统变量覆盖;需确保.env在根目录、environment.php调用DotEnv::load()、键名全大写无空格、清除writable/cache并重启服务。

CI4的.env配置不生效,最常见的情况是改完文件后页面没变化、数据库连不上、baseURL还是localhost——其实不是配置写错了,而是框架根本没读到那行内容。
确认.env文件位置和命名是否正确
把.env文件放在项目根目录(即public同级目录),不能放在app/、public/或writable/里。Windows用户特别注意:用记事本另存为时选“所有文件”类型,编码选UTF-8无BOM,否则文件实际叫.env.txt但系统显示为.env。
运行ls -la(Linux/macOS)或dir(Windows)确认文件名确实是【.env】,开头带点,不是env或.env.example。
检查环境变量是否被真正加载
CI4默认通过app/Config/Boot/environment.php调用DotEnv::load()来读取.env,但这个文件可能被注释、删改或跳过。打开app/Config/Boot/environment.php,确认存在且未被注释的这行代码:
DotEnv::load();
如果不存在,手动补上;如果整段boot逻辑被重写或替换,需确保DotEnv::load()在应用启动早期执行——它必须在任何配置类实例化前运行,否则后续读取的仍是默认值。
验证.env语法和键名是否合规
方法一:键名必须全大写+下划线,且严格匹配CI4规范
APP_BASEURL="https://example.com" ✅app.baseURL="https://example.com" ❌(CI4不识别小写或点号)APP_BASE_URL="https://example.com" ❌(CI4要求APP_BASEURL,中间不能有下划线)
方法二:值前后不能有空格
CI_ENVIRONMENT = "development" ❌(等号两边空格导致值为空字符串)CI_ENVIRONMENT="development" ✅
方法三:数组类配置要用点号路径展开
数据库配置不能写成:DATABASE=["default"=>["hostname"=>"127.0.0.1"]] ❌
必须拆成:database.default.hostname="127.0.0.1" ✅database.default.database="ci4_app" ✅
清除缓存并重启服务
第一步:删除writable/cache/目录下所有文件
第二步:若使用PHP内置服务器,关闭后重新执行php spark serve
第三步:如果是Nginx/Apache,重启Web服务或清掉OPcache(如执行opcache_reset())
【改完.env后不清理writable/cache/,旧缓存会强制沿用上一轮解析结果,新配置看似完全不生效】
排查是否被系统环境变量覆盖
在终端执行echo $CI_ENVIRONMENT(Linux/macOS)或echo %CI_ENVIRONMENT%(Windows),如果返回非空值,说明系统级环境变量已存在且优先级高于.env——CI4会跳过.env中同名项。
临时验证方式:在项目根目录下新建一个test_env.php,写入:
<?php require_once 'vendor/autoload.php'; $dotenv = \Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); echo $_ENV['CI_ENVIRONMENT'] ?? 'not loaded'; ?>
直接浏览器访问该文件,输出development才表示.env确实被读进来了。

















