Env变量名必须全大写加下划线,大小写敏感;如DB_HOST✅,db_host❌、Db_Host❌、DB-Host❌;APP_ENV大小写错误会导致环境配置失效;验证需用dump(getenv('KEY'))而非$_ENV。

Env 变量名必须全大写 + 下划线,大小写敏感
ThinkPHP 的 env() 函数底层依赖 vlucas/phpdotenv,而该库读取的是 PHP 的 $_ENV 或 getenv(),这两个来源在 Linux/macOS 下默认**完全区分大小写**。哪怕写成 db_host 或 Db_Host,env('DB_HOST') 都会返回 false 或 null,而不是你预期的值。
-
DB_HOST✅(唯一有效写法) -
db_host❌(env('DB_HOST')读不到) -
Db_Host❌(大小写混用不识别) -
DB-Host❌(含短横线,不符合变量命名规则)
配置文件里调用 env() 时,键名大小写必须和 .env 里完全一致
你在 .env 里写的是 DB_USER=root,那在 config/database.php 中就必须写 env('DB_USER', 'root') —— 少一个字母、换一个大小写,就断连。这不是 ThinkPHP 的“约定”,而是 getenv() 系统调用本身的限制。
- 错误示例:
.env写REDIS_PORT=6379,但代码里写env('redis_port')→ 返回false - 正确做法:统一用全大写+下划线,如
REDIS_PORT、API_V1_URL、JWT_SECRET_KEY - 注意数字不能开头:
3RD_PARTY_API❌,应改为THIRD_PARTY_API✅
APP_ENV 大小写错会导致整个环境配置失效
APP_ENV 不只是个普通变量,它直接控制 ThinkPHP 加载哪个配置目录(如 config/dev/ 还是 config/prod/)。如果 .env 里写成 APP_ENV=Dev 或 app_env=dev,框架会找不到对应目录,退回到根配置,APP_DEBUG=true 这类关键开关就白写了。
-
APP_ENV=dev✅(小写,且 config/ 下必须有dev/目录) -
APP_ENV=DEV❌(目录需叫DEV/,但通常没人这么建) -
APP_ENV=Dev❌(大小写混合,目录匹配失败) -
app_env=dev❌(变量名本身就不合法,env('APP_ENV')读不到)
为什么有时候改了 .env 却像没生效?先查大小写
最常被忽略的调试路径是:以为变量名写对了,其实只差一个大写。比如把 DB_PWD 错打成 DB_pwd,env('DB_PWD') 返回 null,而数据库密码字段又没设默认值,连接就会因空密码失败。这类问题不会报错,只会静默 fallback 到默认值或触发连接异常。
立即学习“PHP免费学习笔记(深入)”;
- 验证方式:在控制器里加一行
dump(getenv('DB_PWD'));,看输出是否是你期望的字符串 - 别依赖
print_r($_ENV),因为vlucas/phpdotenv默认不往$_ENV写(除非显式调用Dotenv::createUnsafeImmutable()->load()) - 真正可靠的检查点只有两个:
.env文件里的原始写法 +env('KEY')调用时的 KEY 字符串
.env 后,建议用文本编辑器开启“显示不可见字符”模式,再逐行核对变量名。



















