thinkphp环境目录名必须与app_env值逐字符完全一致:全小写、无下划线/中划线/后缀,如prod→config/prod/;app_env须在php启动前由web服务器或cli显式设置,.env仅用于配置项覆盖而非环境切换。

config/ 下的环境目录名必须和 APP_ENV 值完全一致
ThinkPHP 不会根据 .env 文件内容“猜测”你要用哪个环境,它只认 APP_ENV 这个环境变量的值,并严格用它拼出 config/ 下的子目录路径。比如 APP_ENV=prod → 就加载 config/prod/;APP_ENV=testing → 就加载 config/testing/。
常见错误是写成 config/production/ 或 config/PROD/,结果框架静默跳过,回退到根 config/ 下的默认配置,导致数据库连错、缓存不生效、日志写不进文件等。
- 目录名必须全小写(
dev✅,Dev❌,DEV❌) - 不能带下划线或中划线(
pre_prod❌,pre-prod❌) - 不能加 .php 后缀(
prod.php❌) - 不能是空目录——哪怕只放一个
app.php,也比没有强
APP_ENV 必须在 PHP 启动前设置,不是写在 .env 里就生效
.env 文件本身只是用来覆盖配置项的,它不决定“加载哪个环境目录”。真正起决定作用的是 PHP 进程启动时已存在的 APP_ENV 环境变量。
典型失败场景:
- Nginx/Apache 没在
fastcgi_param或SetEnv里设APP_ENV=prod→ 线上永远走dev配置 - CLI 下执行
php think optimize:config时没加前缀 →APP_ENV=prod php think optimize:config才对,漏了就生成错的缓存 - Docker 容器启动时没传
-e APP_ENV=prod→ 容器内始终是默认值(通常是production,但 TP 不认这个默认值)
环境目录下必须有 app.php,否则调试模式等关键配置不生效
config/dev/app.php 里通常定义 'app_debug' => true、'show_error_msg' => true 等开关,而根目录 config/app.php 里这些值往往是 false。如果 config/dev/ 目录存在但没 app.php,框架不会报错,但 config('app.app_debug') 就永远是 false——你改了 .env 也没用。
- 每个环境目录至少应包含:
app.php、database.php、cache.php、log.php - 文件名必须是小写 + .php(
App.php❌,database.yaml❌) - 不要把敏感配置(如数据库密码)写在根
config/database.php,必须下沉到环境目录或.env
多环境文件(.env.dev/.env.test)只是辅助,不替代 APP_ENV
项目根目录放 .env.dev、.env.test 是为了方便部署时快速切换,但它们本身不会自动生效。你得手动复制或符号链接成 .env,再确保 APP_ENV 匹配对应环境名。
例如:
- 本地开发:软链
ln -sf .env.dev .env+ 确保 Web 服务器设了APP_ENV=dev - CI/CD 流水线:用脚本把
.env.prodcp 成.env,再启动前 exportAPP_ENV=prod - 别指望
.env.test会被自动加载——TP 只读.env,其他名字的文件完全无视
最易被忽略的一点:环境目录名和 APP_ENV 值必须逐字符一致,包括大小写、有无空格、是否带前导/后缀——差一个字母,整个环境配置层就失效了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











