thinkphp 8.0+ 多环境配置必须通过系统级 app_env 变量触发加载 .env. 文件,而非自动识别文件名;需确保 app_env 由系统环境变量设置、.env. 文件为 utf-8 无 bom 编码、位于项目根目录、配置文件中显式调用 env() 并清空配置缓存。

ThinkPHP 8.0+ 多环境 .env.* 文件必须靠系统级 APP_ENV 触发
ThinkPHP 8.0 开始不再自动读取 .env.dev 或 .env.test——它只认系统环境变量 APP_ENV 的值,然后按规则拼出文件名去加载。也就是说,.env.test 文件本身不会生效,除非你让 PHP 进程启动时就带着 APP_ENV=test。
常见错误现象:把 .env.test 放在根目录、内容也写对了,但 env('DB_HOST') 还是返回 .env 里的值,或直接 null。
- Linux/macOS CLI 启动服务时,必须前置设置:
APP_ENV=test php think run - Windows CMD 中要用:
set APP_ENV=test && php think run(注意是&&,不是&) - Web 服务器(Nginx/Apache)需显式透传该变量:
Nginx 示例:fastcgi_param APP_ENV test;
Apache 示例:SetEnv APP_ENV test - 验证是否生效:在控制器里加
dump(getenv('APP_ENV'));,输出必须是字符串test,不能是false或空
.env.test 文件格式和位置必须严格匹配框架解析逻辑
ThinkPHP 8 使用 vlucas/phpdotenv 加载 .env.* 文件,但它**不支持 INI 分段语法**。哪怕你写 [database] 块,env('database.hostname') 也会返回 null。
正确写法是扁平键值对,全大写 + 下划线,等号两侧零空格:
APP_DEBUG=true LOG_LEVEL='debug' DB_HOST=127.0.0.1 DB_NAME='myapp_test' DB_PASSWORD='pass@123!'
- 文件必须放在项目根目录(与
app/、config/同级),不能放config/下 - 编码必须是 UTF-8 无 BOM;Windows 记事本默认带 BOM,务必用 VS Code 或 Notepad++ 另存为“UTF-8 无签名”
- 值含
@、!、空格等特殊字符,必须用单引号包裹,双引号无效 -
.env(通用配置)仍会被加载,.env.test是叠加覆盖——所以不要在.env.test里重复写通用项,比如APP_NAME
config/database.php 等配置文件必须显式调用 env() 并设默认值
只在 .env.test 里写 DB_NAME=myapp_test 没用。ThinkPHP 不会自动映射到数据库配置——你必须在 config/database.php 里把每个字段都替换成 env() 调用。
例如:
'hostname' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_NAME', ''),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'hostport' => env('DB_PORT', '3306'),
- 第二个参数不可省略;空字符串
''比null安全,尤其对database、password字段 - 不要写成
env('database.name')—— ThinkPHP 8 不支持点号嵌套语法,只认全大写扁平键如DB_NAME - 改完配置文件后,必须执行
php think optimize:config(或php think clear:config),否则缓存中的旧值一直生效
测试环境配置容易被系统变量或缓存静默覆盖
最常踩的坑是:你以为 APP_ENV=test 生效了,其实被服务器全局变量或 Docker 环境覆盖了。
调试建议:
- 在控制器里同时输出:
dump(getenv('APP_ENV'));和dump(env('APP_ENV'));——前者是系统层变量,后者是 dotenv 解析后的值,两者应一致 - 如果
getenv('APP_ENV')是test,但env('DB_NAME')还是.env里的值,说明.env.test没被加载,大概率是编码或路径错 - 如果两个都是
test,但数据库连的还是生产库,检查runtime/config.php是否残留旧缓存,直接删掉它再试 - Docker 用户注意:
docker run -e APP_ENV=test必须加在php think run命令之前,且确保入口脚本没用putenv('APP_ENV=prod')覆盖
多环境的本质不是“多文件”,而是“同一套加载逻辑 + 不同触发信号”。漏掉 APP_ENV 设置、BOM 编码、缓存未清、配置未显式调用 env(),四个条件任一缺失,.env.test 就形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











