ThinkPHP .env文件必须放在项目根目录(与app/、config/、public/同级),因框架仅在此路径下查找且不递归;放错位置(如public/或config/)将导致静默忽略,即使其他配置正确也不生效。

ThinkPHP .env 文件必须放在项目根目录
不是 public/,不是 config/,也不是 app/,而是与它们同级的最外层目录。例如标准 ThinkPHP 6/8 结构中,composer.json、app/、config/、public/ 都在同一个文件夹下,.env 就得放在这里。
为什么放错位置就完全不生效
ThinkPHP 默认只在项目根目录(即 dirname(__DIR__))查找 .env 文件。它不会向上递归,也不会向下扫描子目录。哪怕你把 .env 放进 public/ 并配好 Nginx,框架启动时压根不会去读——因为入口文件 public/index.php 的上一级才是它认定的“项目根”。
- 常见错误:用 FTP 上传时误传到
public/下,结果env('DB_HOST')始终返回null - Windows 用户尤其要注意:记事本保存时默认加 BOM,会导致 ThinkPHP 8 静默跳过整个文件,连报错都没有
- Linux/macOS 下检查路径是否正确,可用
ls -la | grep '\.env'确认文件是否存在且权限为-rw-r--r--(644)
CLI 命令下 .env 仍需根目录 + 显式加载
运行 php think migrate 或 php think optimize:config 时,工作目录通常是项目根,但 ThinkPHP 不会自动加载 .env ——除非你在 think 脚本里手动调用了 Dotenv::load() 或 Env::load()。所以即使路径对了,没加载也白搭。
- 确认
think入口脚本(通常在项目根)中是否包含类似$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); - 如果用的是 ThinkPHP 自带的
\think\Env::load(),注意它只支持扁平键值,不识别[database]这类 INI 段落 - 执行命令后可临时加一行
dump(env('APP_DEBUG'));验证是否读取成功
多环境文件(如 .env.prod)也必须放同一位置
ThinkPHP 8 支持按 APP_ENV 加载 .env.{env},比如 APP_ENV=prod 时读 .env.prod,但它依然要求这个文件和 .env 在同一个目录下,即项目根目录。
立即学习“PHP免费学习笔记(深入)”;
-
.env.prod和.env是并列关系,不是子目录或嵌套 - 不能写成
config/.env.prod,否则框架根本找不到 - 若同时存在
.env和.env.prod,ThinkPHP 8 会先加载.env(通用配置),再用.env.prod覆盖其中同名变量
env() 返回的都可能是 null 或空字符串。



















