ThinkPHP 多环境由 APP_ENV 决定,需在 PHP 启动前通过 Web 服务器或 CLI 设置;.env.dev/.env.prod 仅为覆盖层,依赖 APP_ENV 生效后加载;环境名须全小写、目录名严格匹配;.env 文件须 UTF-8 无 BOM;缓存配置后需重执行 optimize:config。

ThinkPHP 多环境靠 APP_ENV 决定加载哪套配置,.env 文件本身只是覆盖层,不决定环境——必须先让 APP_ENV 生效,.env.dev 或 .env.prod 才会被读取。
APP_ENV 必须在 PHP 启动前设置
框架启动时就检查 APP_ENV,如果它没被系统环境变量设好,后续所有环境专用逻辑(比如加载 config/dev/ 目录、读取 .env.dev)都会跳过。
- Nginx 配置里加:
fastcgi_param APP_ENV dev;(开发)或fastcgi_param APP_ENV prod;(生产) - Apache 用:
SetEnv APP_ENV dev放在.htaccess或虚拟主机配置中 - CLI 命令要显式带环境:
APP_ENV=prod php think optimize:config,否则默认是production但可能不按你预期走 - 确认
php.ini中variables_order包含"E",否则getenv()读不到
文件名和目录名必须严格小写且匹配
ThinkPHP 对环境名大小写敏感,且只认全小写的目录和文件名。写成 .env.DEV 或 config/Dev/,框架直接忽略。
- 推荐命名方式:
.env.dev、.env.prod(不是.env.development) - 对应配置目录必须是:
config/dev/、config/prod/(不能是config/development/) -
APP_ENV=dev→ 加载config/dev/下的文件,再用.env.dev覆盖其中同名键 - 删掉
config/dev/目录?那即使APP_ENV=dev,框架也 fallback 到空配置或报错,不会退而求其次读config/app.php
env() 函数读不到值?先查 .env 文件是否被加载
env('DB_HOST') 返回 false 或 null,大概率不是配置写错了,而是 .env.dev 根本没被 vlucas/phpdotenv 解析。
立即学习“PHP免费学习笔记(深入)”;
- 确保在
public/index.php中、require __DIR__.'/../thinkphp/start.php';之前调用:Dotenv\Dotenv::createImmutable(__DIR__.'/..', '.env.dev')->load(); - 不要手动改
APP_ENV后还用默认.env:框架不会自动拼接.env.$APP_ENV,得自己写逻辑选文件 -
.env文件编码必须是 UTF-8 无 BOM,有 BOM 就静默失败 - 运行
php think optimize:config后,缓存会固化当前配置,改了.env也不生效——必须重新执行该命令
最容易被忽略的一点:环境判断逻辑(比如 if (env('APP_ENV') === 'prod'))永远不如直接读 getenv('APP_ENV') 可靠,因为 env() 是框架封装层,可能被缓存或覆盖;而 getenv() 是原始系统变量,才是 APP_ENV 真正的来源。



















