跳转到主内容
极星编程网:以代码为星,赴技术山海!

ThinkPHP如何做多环境配置_ThinkPHP开发测试生产配置分离【指南】

ThinkPHP 的 .env 文件仅在 App::init() 阶段由 think\Env 类加载一次,且仅当 PHP 环境变量未预设 APP_ENV 时才读取;必须置于项目根目录,变量含特殊字符需单引号包裹,配置通过 env() 在配置文件中调用生效。 ThinkPHP 的
.env
文件怎么生效? ThinkPHP 6+ 默认用
.env
控制环境,但不是“放进去就自动读”——它只在
App::init()
阶段由
think\Env
类加载一次,且**仅当
APP_ENV
未被 PHP 环境变量预设时才 fallback 到文件**。 常见错误:改了
.env
但配置没变 → 检查是否在 CLI 或 Nginx 中提前设置了
APP_ENV=prod
,它会跳过
.env
开发机本地调试建议直接删掉服务器上的
APP_ENV
环境变量,让框架老老实实读
.env
.env
必须放在项目根目录(和
think
命令同级),不在
config/
下,也不支持嵌套路径 变量值含空格或特殊字符必须用单引号包裹,比如
DB_PASSWORD='pass@123!'
,否则解析失败 不同环境怎么写数据库配置? 别在
config/database.php
里写死 host 或 port,全交给
.env
驱动。ThinkPHP 的
Env
类会把
.env
变量转成大写键名,所以
DB_HOST
对应
env('DB_HOST')
。 开发环境:
DB_HOST=127.0.0.1
、
DB_NAME=tp_dev
测试环境:
DB_HOST=test-mysql
、
DB_NAME=tp_test
(Docker Compose 场景下常用服务名) 生产环境:务必用
DB_HOST
指向内网地址,禁用
localhost
(MySQL 会走 socket,可能权限不一致) 注意
DB_PREFIX
如果为空,别写
DB_PREFIX=
,要写成
DB_PREFIX=''
,否则会被当成字符串
"DB_PREFIX"
如何让路由/缓存/日志按环境切换? ThinkPHP 不提供“环境专属配置文件”,所有差异化都靠
env()
+ 三元判断。硬编码分支比抽离文件更可控,也避免加载多余配置。 路由:在
app/route.php
里用
if ('dev' === env('APP_ENV')) { Route::rule(...); }
缓存:Redis 连接数在生产环境建议调高,开发环境可设
CACHE_TYPE=file
避免依赖服务 日志:生产环境关掉
trace
,开发环境打开
log.level = 'debug'
,但别在
.env
里写
LOG_LEVEL=debug
—— ThinkPHP 不识别这个键,要用
LOG_LEVEL
对应的底层配置项
log.level
关键点:所有
env()
调用必须在配置文件中完成,不能在控制器里动态改
Config::set()
,因为配置已冻结 部署时
.env
总被 git 提交或覆盖怎么办?
.env
是敏感文件,也是环境标识开关,它不该进版本库,也不能靠手动上传维护。 立即学习 “ PHP免费学习笔记(深入) ”; 立刻把
.env
加进
.gitignore
,同时保留
.env.example
(不含真实密码,只示范结构) 上线脚本里加一步:检测
.env
是否存在,不存在则
cp .env.example .env && chmod 600 .env
Docker 部署时,用
--env-file
参数传入,不要 COPY
.env
到镜像里(镜像该是无状态的) 最容易被忽略的是:CI/CD 流水线里如果用了
composer install --no-dev
,记得确认
vlucas/phpdotenv
没被误删——它是
think-orm
的隐式依赖,删了
.env
就彻底失效

相关文章