ThinkPHP 不读取 .example.env,必须复制为 .env 并确保权限正确;修改后需清除缓存、检查等号空格、引号包裹特殊字符、注释格式及编码;.env 不得提交至 Git,上线前须核查敏感配置。

ThinkPHP 项目里 .example.env 不生效?先确认是否已复制为 .env
ThinkPHP 默认不会读取 .example.env,它只识别 .env 文件。这个文件名带 .example 后缀,本身就是个示例模板,不是运行时配置文件。
常见错误现象:Env::get('APP_DEBUG') 返回 null 或默认值,php think run 启动后环境变量没变,数据库连接失败但配置看起来没错。
- 必须手动复制:
cp .example.env .env(Linux/macOS)或重命名(Windows 资源管理器中去掉.example) - 复制后检查文件权限:确保 Web 服务器用户(如
www-data或nginx)有读取.env的权限 - 不要直接编辑
.example.env并指望它起作用——ThinkPHP 的think\facade\Env类在加载时会跳过所有带.example的文件
为什么改完 .env 还是读不到新值?检查加载时机和缓存
ThinkPHP 在应用初始化早期就加载 .env,如果在 bootstrap.php 或 base.php 之前已有代码调用 Env::get(),就会拿到空值。
更常见的原因是:开发环境启用了配置缓存,导致 .env 修改不被重新读取。
立即学习“PHP免费学习笔记(深入)”;
- 执行
php think clear清除所有缓存(包括配置缓存) - 确认
config_cache_path配置项未被硬编码覆盖,否则.env变量可能被缓存中的旧值屏蔽 - 调试时可在
public/index.php开头加var_dump($_ENV); die;,看原生环境变量是否已注入(PHP 7.1+ 支持自动加载.env,但 ThinkPHP 实际走的是自研的Env加载逻辑)
修改 .env 后数据库连不上?重点核对这三处格式细节
.env 是键值对格式,ThinkPHP 对空格、引号、注释非常敏感,一个不小心就解析失败。
- 等号两侧不能有空格:
DB_HOST=127.0.0.1✅,DB_HOST = 127.0.0.1❌(会被当成字符串字面量,不解析) - 含特殊字符(如密码里的
@、/)必须用单引号包裹:DB_PASSWORD='pass@123',双引号或不加引号会导致解析截断 - 注释必须独占一行且以
#开头:# DB_PORT=3306✅,DB_PORT=3306 # 注释❌(整行会被忽略) - 中文等非 ASCII 字符需保存为 UTF-8 无 BOM 格式,否则
Env::load()解析时可能报错或静默失败
部署到生产环境时,.env 文件千万别提交到 Git
.env 包含数据库密码、API 密钥等敏感信息,一旦泄露风险极高。ThinkPHP 官方也明确建议将其加入 .gitignore。
- 确保
.gitignore中有这一行:.env - 如果已经误提交,需用
git rm --cached .env移除追踪,并强制推送更新的 ignore 规则 - 线上部署流程中,应通过运维工具(如 Ansible、Docker volume)或 CI/CD 环境变量注入方式生成
.env,而不是从代码库复制
最常被忽略的一点:本地测试时用 .env 很方便,但上线前若忘记删掉调试配置(比如 APP_DEBUG=true),可能直接把整个错误堆栈暴露给用户。别依赖“我只在本地改”,要养成每次上线前检查 .env 内容的习惯。



















