ThinkPHP 通过 .env 实现环境变量配置,需将 UTF-8 无 BOM 编码的 .env 文件置于项目根目录,使用 ini 格式(如 APP_DEBUG=true),并配合 env() 函数读取;首次修改后须清空 runtime 缓存,多环境可通过 APP_ENV 切换不同 .env.* 文件。

ThinkPHP 用 .env 配置环境变量,核心是“先加载、再覆盖、分环境”,不是简单放个文件就生效。关键在加载时机、变量命名规范、以及和配置文件的协作关系。
确保 .env 文件位置和格式正确
文件必须放在项目根目录(与 app、config、public 同级),不能放在 app/ 或 config/ 里。
文件编码必须是UTF-8 无 BOM,否则 ThinkPHP 会静默忽略,不报错也不加载。
内容用 ini 格式,键名不区分大小写,但推荐全大写加下划线;等号前后不要空格,字符串值不用引号:
-
APP_DEBUG=true✅(正确) -
APP_DEBUG = "true"❌(带空格和引号,可能失效) -
app_debug=true✅(可读,但建议统一风格)
让 .env 真正被框架读取
ThinkPHP 5.1+ 默认支持自动加载根目录下的 .env,但需确认以下几点:
- 首次部署或修改
.env后,务必清空运行时缓存:php think clear:runtime或手动删掉runtime/目录 - Web 环境下(如 Nginx),需在 fastcgi_param 中透传系统变量,例如:
fastcgi_param APP_ENV $APP_ENV;;Apache 则用SetEnv APP_ENV dev - CLI 模式下启动命令要前置设置:
APP_ENV=prod php think run,否则APP_ENV可能为空,导致加载不到对应环境配置
在代码里安全读取环境变量
推荐使用助手函数 env(),它比直接查 $_ENV 更可靠,且支持默认值:
-
env('APP_DEBUG', false)—— 读一级变量 -
env('database.hostname', '127.0.0.1')—— 支持点号分隔的嵌套写法(对应[database]区块) - 在
config/database.php等配置文件中直接调用:'hostname' => env('database.hostname', 'localhost')
注意:APP_DEBUG 和 APP_TRACE 这两个变量会被框架自动识别并生效,其它变量必须显式调用 env() 才能进入配置体系。
进阶:配合 APP_ENV 实现多环境切换
单靠一个 .env 不足以支撑开发、测试、生产分离。更健壮的做法是:
- 项目根目录下准备多个文件:
.env.dev、.env.test、.env.prod - 通过系统级
APP_ENV=dev决定加载哪个文件(不是读.env里的APP_ENV) - 在
public/index.php中手动集成vlucas/phpdotenv并指定加载:Dotenv::createImmutable(__DIR__.'/..', '.env.dev')->load(); - 通用配置仍保留在主
.env中,环境特有项(如REDIS_HOST、LOG_LEVEL)写在对应.env.*文件里
改完后别忘了执行 php think optimize:config 更新配置缓存,否则新变量不会生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











