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 是敏感文件,也是环境标识开关,它不该进版本库,也不能靠手动上传维护。
- 立刻把
.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就彻底失效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










