ThinkPHP 6.0 默认自动加载根目录 .env 文件,需确保文件存在、命名正确、格式规范,且 public/index.php 中包含标准加载逻辑(位于 autoload.php 后、App 实例化前),否则需手动用 Dotenv 加载并清空 runtime 缓存验证。

ThinkPHP 6.0 默认会在框架启动早期自动加载项目根目录下的 .env 文件,但前提是文件存在、命名正确、格式规范,且入口未被修改或禁用自动加载逻辑。如果你发现 .env 变量没生效,大概率是入口未显式加载,或自动加载机制被绕过(比如自定义了启动流程、用了 CLI 模式、或部署在某些容器/面板中自动加载被抑制)。
以下是几种可靠、可验证的入口加载方式,按推荐顺序排列:
确保 public/index.php 中有标准加载逻辑
打开 public/index.php,检查是否包含类似以下代码(TP6 官方安装后默认已有,但部分定制或旧模板可能缺失):
if (is_file(dirname(__DIR__) . '/.env')) {
$env = new \think\facade\Env();
$env->load(dirname(__DIR__) . '/.env');
}
✅ 这段代码必须出现在 require __DIR__ . '/../vendor/autoload.php'; 之后、new think\App() 实例化之前。
⚠️ 若你删过或注释掉这段,.env 就不会被读取。
使用 Dotenv 手动加载(更可控,推荐用于多环境)
如果你需要按 APP_ENV 加载不同文件(如 .env.development),可在 public/index.php 开头手动引入并加载:
use Dotenv\Dotenv;
// 设置 APP_ENV(若系统未设置)
if (!getenv('APP_ENV')) {
putenv('APP_ENV=' . ($_SERVER['APP_ENV'] ?? 'production'));
}
$envFile = dirname(__DIR__) . '/.env.' . getenv('APP_ENV');
if (is_file($envFile)) {
Dotenv::createImmutable(dirname(__DIR__), basename($envFile))->load();
} else {
// 回退加载基础 .env
if (is_file(dirname(__DIR__) . '/.env')) {
Dotenv::createImmutable(dirname(__DIR__), '.env')->load();
}
}
? 注意:需先通过 Composer 安装 vlucas/phpdotenv(TP6 默认已包含,无需重复安装)。
验证是否加载成功的小技巧
在控制器或中间件里临时加一行测试:
dump(getenv('APP_DEBUG'), env('APP_DEBUG'), Env::get('app_debug'));
- 如果三者都返回
true/false,说明加载成功; - 如果全是
false或null,说明.env未被识别或解析失败。
常见踩坑点直接对照
-
.env文件必须放在 项目根目录(与app/、config/、vendor/同级),不是public/下 - 文件名必须是纯
.env,不能是.env.txt、env、.env.local(除非你手动指定) - 每行只能是
KEY=VALUE,不能有空格、引号、冒号、分号,例如DB_HOST = "127.0.0.1"❌,应写成DB_HOST=127.0.0.1✅ - 修改后务必清空
runtime/目录下的缓存(尤其是cache/和log/),否则旧变量可能被缓存沿用
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











