thinkphp 6 通过 app_env 环境变量控制多环境配置,nginx 必须显式透传 fastcgi_param app_env $app_env; 否则 fallback 至 config/ 根目录;.env 不参与 web 请求环境加载,仅用于 cli;config/app_env/ 下需独立配置文件,禁止条件判断;.env 不得提交 git,生产由运维手动创建最小集。

ThinkPHP 6 的环境参数隔离不靠写死判断,也不靠域名或 IP 自动识别——它只认 APP_ENV 环境变量,且必须由 Web 服务器显式透传,否则一律 fallback 到 config/ 根目录。
为什么 .env 里改了 APP_ENV 却没生效
CLI 下(如 php think optimize:config)能读取 .env,但 FPM 请求不会自动加载它。Nginx/Apache 不会把 .env 内容注入 PHP 运行时,只负责传入 fastcgi_param 或环境变量。
- 常见错误:本地用内置服务器测试正常,一上 Nginx 就退回到默认配置
- 根本原因:Nginx 配置里漏了
fastcgi_param APP_ENV $app_env; - 验证方法:在控制器里打印
$_SERVER['APP_ENV'],为空就说明没传过去 - 正确做法:在
location ~ \.php$块内加该行,并确保$app_env已定义(例如通过set $app_env "production";或从系统环境继承)
config/APP_ENV/ 目录下怎么写配置文件
ThinkPHP 6 不支持在配置文件中写 if (APP_ENV === 'develop'),因为框架还没读到环境变量就已开始加载配置,此时 APP_ENV 还不可用。
- 必须为每个环境建独立目录:
config/develop/、config/production/ - 文件名需与根目录一致,如
database.php、cache.php - 只改差异项:开发库用
'hostname' => '127.0.0.1',生产用'hostname' => 'db-prod.internal' - 生产务必删掉
'params' => [PDO::ATTR_EMULATE_PREPARES => true],否则预处理失效 - 不要在
.env中写APP_URL或ASSET_URL,应由 Nginx 的fastcgi_param注入
.env 文件本身该怎么管
.env 是运行时入口,不是配置源,它的唯一作用是给 CLI 和 Web 服务提供初始环境变量值。一旦提交到 Git,敏感信息就暴露了。
- 立刻执行
echo ".env" >> .gitignore并提交 - 生产环境禁止用
git clone同步.env,必须由运维手动创建 - 线上
.env只保留三项最小集:APP_ENV=production、APP_DEBUG=false、DB_PASSWORD=xxx -
APP_DEBUG=true仅用于开发排查,不能代替环境切换逻辑 - runtime 目录必须可写,否则环境切换后缓存不会重建,导致旧配置残留
最常被忽略的是 Nginx 没传 APP_ENV —— 它不像 APP_DEBUG 那样有兜底行为,缺了就是缺了,框架直接放弃加载 config/APP_ENV/ 目录,连报错都不会有。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











