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