thinkphp 的 .env 文件需同时满足路径在根目录、utf-8无bom编码、格式规范(等号无空格、值含特殊字符需单引号、注释独占行、变量全大写下划线)、配置文件中显式调用 env('key', 'default')、以及清除 runtime/config.php 缓存,五者缺一不可。

ThinkPHP 的 .env 文件不会自动生效,必须同时满足路径、编码、格式、调用方式和缓存清理五个硬性条件,缺一不可。只改文件内容但没清缓存,或变量名写成小写,都会导致配置“看起来写了,实际没用”。
文件位置和编码必须严格匹配
.env 必须放在项目根目录(与 app/、config/、public/ 同级),不能放错到 public/ 或 config/ 下。Windows 记事本默认保存带 BOM,会导致 ThinkPHP 8+ 静默忽略整个文件——毫无报错,也不加载。
- 用 VS Code / Notepad++ 新建文件,另存为 UTF-8 无 BOM 编码
- Linux/macOS 下执行
file -i .env确认输出含charset=utf-8,不含with bom - 确保 Web 服务器用户(如
www-data)有读取权限
格式错误会让整行失效且不报错
vlucas/phpdotenv 解析器对空格和引号极其敏感,一处出错就 fallback 到默认值,还不会提示哪一行错了。
- 等号两侧绝对不能有空格:
DB_HOST=127.0.0.1✅,DB_HOST = 127.0.0.1❌ - 值含空格、
@、!、#等特殊字符时,必须用单引号包裹:DB_PWD='pass@123!'✅ - 注释只能独占一行且以
#开头,前面不能有空格;不支持DB_HOST=127.0.0.1 # local这种行末注释 - 变量名必须全大写 + 下划线:
DB_PREFIX✅,db_prefix或DB-Prefix❌
配置文件里必须显式调用 env() 并设默认值
只在 .env 里写 DB_HOST=192.168.1.100 没用,框架根本不会自动替换配置项。所有要用到的字段,都得在 PHP 配置文件中手动改成 env('KEY', 'default') 形式。
- 在
config/database.php中,把'hostname' => '127.0.0.1'改成'hostname' => env('DB_HOST', '127.0.0.1') -
env()第二个参数不可省略;对前缀、密码等可能为空的字段,用空字符串''比null安全得多 - 不能在控制器或模型里“补救式”调用
env()—— 配置加载只发生在入口初始化阶段,一次完成
改完必须清配置缓存,否则永远看不到效果
ThinkPHP 会把所有配置(包括 env() 执行结果)合并写入 runtime/config.php。只要这个缓存存在,哪怕 .env 和配置文件都改对了,也还是旧值。
- 执行
php think clear:config或更彻底的php think optimize:config - 也可以直接删除
runtime/config.php文件 - CLI 模式下若已通过
export APP_ENV=prod设置过系统变量,需确认是否覆盖了.env—— 可在控制器中对比getenv('APP_ENV')和env('APP_ENV')输出
最容易被忽略的是:BOM 编码导致静默失效、等号空格让整行白写、以及改完不删缓存。这三个点卡住 90% 的人,而且没有任何错误提示,只能靠逐项排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











