thinkphp修改.env后config()仍返回旧值,是因为框架将合并配置缓存至runtime/config.php且受opcache双重锁定;需删除该文件、确保app_debug=true触发重建,并重载php-fpm刷新opcache。

ThinkPHP .env修改后不重启服务也能生效,但必须清空 runtime/config.php
改完 .env 文件后,config() 仍返回旧值,不是因为没重启服务,而是框架把合并后的配置缓存到了 runtime/config.php 这个 PHP 文件里。只要这个文件存在,后续所有请求都直接 include 它,完全跳过 .env 解析流程。
- 修改
.env后,手动删除runtime/config.php(保留runtime/目录结构即可) - 确保
APP_DEBUG = true,否则框架会跳过重新生成该缓存文件的逻辑 - 访问任意页面触发配置重载,
runtime/config.php会自动重建,内容即为.env+config/*.php合并结果 - 如果
APP_DEBUG = false,则必须执行php think config:cache手动生成,且不能依赖自动刷新
为什么改了 .env 但 config('database.hostname') 没变
常见错误是误以为框架会“局部更新”配置。实际上 ThinkPHP 在初始化时把整个 database.connections.mysql 配置块用 .env 中的 DB_HOST、DB_NAME 等变量全量替换——哪怕你只改了一个变量,config/database.php 里写的 'hostname' => '127.0.0.1' 也会被彻底丢弃。
-
database.php中必须全部使用env('DB_HOST', '127.0.0.1')形式,不能留死值 -
.env变量名必须大写+下划线:DB_HOST✅,db_host或DBHOST❌ - 密码含
@、/、:时,必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword,否则 PDO DSN 解析失败
TP8 的 .env 是唯一运行时配置源,database.php 只做结构定义
ThinkPHP 8 明确规定:运行时数据库连接完全由 .env 驱动,config/database.php 不参与决策,只负责声明连接结构和提供默认值。这不是“优先级高低”的问题,而是“是否参与加载”的根本区别。
-
database.php中任何硬编码的数据库地址、端口、用户名,只要.env存在且启用了环境加载,就一律无效 - 多库场景下,
database.php必须显式定义多个连接名(如'connections' => ['mysql', 'slave']),代码中用Db::connect('slave')切换,不能靠.env自动扩展 -
.env文件必须是纯文本、无 BOM 的 UTF-8,文件名严格为.env,.env.example或.env.local均不识别
OPcache 会导致 .env 修改看似“不生效”
即使删了 runtime/config.php,config() 仍返回旧值,大概率是 PHP 的 OPcache 缓存了已编译的配置文件字节码。它不会感知文件内容变化,除非手动清除或等待过期。
- 先确认
config('app.app_debug')输出是否为true:若为false,说明框架正从 OPcache 加载旧配置 - 执行
sudo systemctl reload php-fpm(Linux)或重启 phpEnv 的 PHP 服务(Windows/macOS) - 或临时在
php.ini中设opcache.enable=0验证是否为 OPcache 导致 - 生产环境不建议关 OPcache,应走标准流程:改
.env→ 删runtime/config.php→ 重载 PHP-FPM
runtime/config.php 和 OPcache 是两层独立缓存,且都必须主动干预才能让 .env 生效。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











