runtime/config.php是thinkphp启动时合并.env、config/*.php等配置源生成的缓存快照,仅在清缓存或重建后更新;修改.env本身不会自动刷新该文件,需执行php think clear:config或删除文件触发重生成。

runtime/config.php 是 .env 解析结果的缓存快照
ThinkPHP 启动时会把所有配置源(.env、config/*.php、运行时 config() 调用)合并成一个最终数组,并写入 runtime/config.php。这个文件不是手动维护的,而是框架自动生成的“编译后配置”,后续请求直接读它,跳过重复解析。
也就是说:.env 的值只有在首次加载或清缓存后,才会真正进入 runtime/config.php;一旦写入,改 .env 本身不会触发更新——你看到的永远是上次缓存的内容。
-
runtime/config.php里没有注释、没有函数调用,全是纯 PHP 数组,比如'hostname' => '192.168.1.100',而不是env('DB_HOST', '127.0.0.1') - 如果
.env编码错误(如带 BOM)、路径不对、或没在配置文件中用env()显式引用,那它的值根本不会被读取,自然也不会进runtime/config.php -
runtime/config.php权限必须为 Web 进程可读;若 PHP-FPM 用户无权读取,框架会 fallback 到重新解析源文件,但行为不可控,容易漏配
改了 .env 但 runtime/config.php 没变?这是正常现象
ThinkPHP 不监听 .env 文件变化,也不自动重载配置。你改完 .env,runtime/config.php 仍保留旧内容,除非你主动触发重建。
- 执行
php think clear:config删除缓存,再访问任意页面,框架会重新合并并生成新runtime/config.php - 或直接删掉
runtime/config.php文件,下次请求自动重建(前提是配置能正常加载) - 使用
php think optimize:config可强制全量重建,适合部署后批量刷新 - 开发期可临时关闭配置缓存:在
app/config.php中设'config_cache' => false,避免反复清缓存
为什么有时 config() 有值,但 env() 返回 null?
因为 config() 读的是最终合并结果(含 .env + 配置文件 + 运行时设置),而 env() 只读原始环境变量或 .env 文件——它不经过框架合并逻辑。
-
env('DB_HOST')返回null,常见原因是.env文件未被vlucas/phpdotenv加载,比如入口文件里漏了Dotenv::createImmutable(...)->load() -
config('database.hostname')却有值,说明该字段是从config/database.php的默认值来的,而非.env - 检查是否用了
env('DB_HOST', '127.0.0.1')的写法:第二个参数不能省,否则env()返回null,而config()会因数组键缺失导致空字符串或报错
线上环境要不要保留 .env 文件?
要,但必须确保它不被 Web 直接访问,且权限可控。很多线上问题源于 .env 被忽略、权限错误,或与 runtime/config.php 内容脱节。
- 上线前务必确认
.env在项目根目录,且chmod 644(Linux/macOS),Web 用户可读但不可写 - 不要把
.env提交到 Git —— 它应出现在.gitignore中;CI/CD 部署时通过安全方式注入(如 GitHub Secrets 或服务器环境变量) - 若线上禁用
.env(如设APP_ENV=production并移除文件),则所有env()调用失效,config()全靠config/database.php等硬编码值支撑,此时runtime/config.php就是唯一可信来源
runtime/config.php 是“结果”,不是“源头”;调试配置问题时,别只盯着它看——得回溯 .env 是否被正确加载、是否被 env() 引用、是否被缓存锁死。否则你会反复删文件、重启服务,却始终卡在同一个地方。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











