ThinkPHP .env不生效主因是位置、编码、格式或加载四环节之一出错:须置于根目录、UTF-8无BOM、等号无空格且值含特殊字符需加引号、配置文件中显式调用env('KEY','default')并清缓存。

ThinkPHP 的 .env 文件不生效,不是配置写错了,而是四个关键环节中某一处断了:位置不对、编码出错、格式越界、或根本没被加载。修复它不靠猜,而要按顺序验证这四点。
文件位置与权限必须严格匹配
.env 必须放在项目根目录(与 app/、config/、public/ 同级),不能在 public/ 下,也不能在 config/ 里。Windows 用户尤其注意:用记事本保存时默认加 BOM,会导致 ThinkPHP 8 完全静默忽略该文件。
- 用 VS Code 或 Notepad++ 新建文件,另存为「UTF-8 无 BOM」格式
- Linux/macOS 下执行
file -i .env确认编码是utf-8,不含with BOM - 确保 Web 服务器用户(如
www-data或nginx)有读取权限:chmod 644 .env
语法格式零容忍——空格、引号、大小写全要对
vlucas/phpdotenv 解析器极其敏感,一行格式错误,整行失效,且不报错。
- 等号两侧绝对不能有空格:
DB_HOST=127.0.0.1✅,DB_HOST = 127.0.0.1❌ - 值含
@、!、#、空格等特殊字符,必须用单引号包裹:DB_PWD='pass@123!'✅ - 变量名全大写 + 下划线:
REDIS_HOST✅,redis_host或REDIS-HOST❌ - 注释只能独占一行,以
#开头;不支持行末注释
配置文件中必须显式调用 env() 并设默认值
只在 .env 里写 DB_NAME=myapp 是无效的。必须在 config/database.php 等配置文件中,把每个字段替换成 env('KEY', 'default') 形式。
立即学习“PHP免费学习笔记(深入)”;
- 示例:
'database' => env('DB_NAME', 'thinkphp'), - 第二个参数不可省略,尤其对密码、前缀等字段,空字符串
''比null更安全 - 不能在控制器或模型里临时补调
env()—— 配置加载只在入口初始化阶段执行一次
CLI 和 Swoole 场景需手动加载
HTTP 请求下 ThinkPHP 可能自动加载 .env,但命令行(如 php think migrate)和 Swoole 常默认跳过,必须手动触发。
- 打开项目根目录下的
think文件,在return前插入: if (PHP_SAPI === 'cli') { \Dotenv\Dotenv::createImmutable(__DIR__)->safeLoad(); }- 定时任务要确保工作目录为项目根目录,例如:
cd /var/www/html && php think schedule:run - Swoole 服务重启后,
.env修改必须重启进程才生效
改完之后,别忘了清缓存:php think clear:config 或直接删掉 runtime/config.php。只要缓存还在,再改 .env 也看不到效果。



















