.env 文件由 composer create-project 生成于项目根目录(含 composer.json 的层级),非 public/ 或 config/ 下;Windows 需开启显示隐藏文件,Linux/macOS 用 ls -a 查看;失效主因包括 UTF-8 with BOM 编码、等号空格、特殊字符未引号包裹、框架未调用 env() 函数读取、CLI 下未显式加载及配置缓存未清除。

composer create-project 命令本身会生成 .env 文件,但你没看到,大概率是它被静默跳过了——不是没生成,而是你根本没在正确位置找,或它被编码/权限/加载逻辑拦在了门外。
composer create-project 生成的 .env 在哪?
- 它一定在项目根目录(即含
app/、config/、public/、composer.json的那层),不是public/下,也不是config/下 - Windows 资源管理器默认隐藏以
.开头的文件,需手动开启“显示隐藏的项目” - VS Code 或终端里执行
ls -a(Linux/macOS)或dir /a(Windows)可确认是否存在
为什么明明有 .env 却像“没生效”?
-
.env文件保存为 UTF-8 with BOM(常见于 Windows 记事本)→ ThinkPHP 8 直接跳过解析,不报错、不提示、不加载 - 文件里写了
DB_HOST = 127.0.0.1(等号带空格)→vlucas/phpdotenv解析失败,整行丢弃 - 值含
@、!、空格却没加引号:DB_PWD=p@ss!2026❌ → 必须写成DB_PWD='p@ss!2026'✅ - 你在
config/database.php里仍写死'hostname' => '127.0.0.1',没改成env('DB_HOST', '127.0.0.1')→ 框架压根不会去查.env
CLI 启动时 .env 为何“突然消失”?
- ThinkPHP 8 默认只在
public/index.php中加载.env - 你用
php think migrate或php think run启动?这些走的是think文件,不触发自动加载 - 解决办法:打开项目根目录下的
think文件,在return前插入:
if (PHP_SAPI === 'cli') {
\Dotenv\Dotenv::createImmutable(__DIR__)->safeLoad();
}- 注意:
<strong>DIR</strong>必须指向项目根目录(即含composer.json的目录),不是public/或vendor/
最容易被忽略的一环:缓存没清
- ThinkPHP 把所有配置(包括
env()的结果)合并进runtime/config.php - 你改完
.env,没运行php think optimize:config或php think clear:config→ 框架永远读旧缓存 - 手动删
runtime/config.php也行,但别只删runtime/cache/—— 那里没用
真正卡住人的,从来不是“会不会装”,而是“以为装完了,其实 .env 从没被读过”。



















