You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP站点本地JSON文件是否会被浏览器缓存?更新后需清缓存如何解决

问题解答

核心误区澄清

你提供的加时间戳查询参数的代码是完全错误的:你当前使用file_get_contents()读取的是服务器本地磁盘文件,走的是文件系统调用而非HTTP请求,文件系统无法识别?version=这类查询参数,添加后会直接找不到对应文件触发报错。

缓存问题原因说明

JSON文件确实会被浏览器缓存

但仅发生在浏览器直接通过HTTP URL请求JSON静态文件的场景下,比如前端代码直接写fetch('/data/venues.json')时才会触发静态资源缓存规则。
而你当前的逻辑是PHP在服务端先读取本地JSON文件,处理后再输出响应给客户端,客户端遇到的缓存和本地JSON文件本身无关,本质是你PHP输出的页面/接口响应被浏览器缓存了。

解决方案

不要告知用户感受有误,缓存问题完全可以通过服务端配置解决,可选方案如下:

方案1:强制响应不缓存(最简单)

在你的PHP代码最顶部添加3个缓存控制头,强制浏览器每次都请求最新内容:

<?php
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // 兼容旧版HTTP 1.0
header("Expires: 0"); // 代理服务器缓存控制

// 后续读取JSON的原有逻辑
$jsonFile = file_get_contents(ROOT . "/data/venues.json");
$venues   = json_decode($jsonFile, true);

该方案适合站点访问量不大的场景,实现成本极低。

方案2:资源版本戳(性能更优)

如果你的站点访问量较高,全量禁缓存会增加服务器压力,可以用版本戳方案:

  1. 服务端读取JSON文件的修改时间作为版本号,渲染前端页面时把版本号传给前端
    $jsonVersion = filemtime(ROOT . "/data/venues.json");
    // 输出到前端JS变量
    echo "<script>const VENUES_DATA_VERSION = {$jsonVersion};</script>";
    
  2. 前端请求数据时带上版本参数:
    fetch('/your-api-path.php?v=' + VENUES_DATA_VERSION)
    

只要JSON文件更新,版本号就会变动,浏览器会视为全新资源发起请求,不会复用旧缓存,同时未更新时可以正常复用缓存降低服务器负载。


内容的提问来源于stack exchange,提问作者Kirk Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:30:02