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:资源版本戳(性能更优)
如果你的站点访问量较高,全量禁缓存会增加服务器压力,可以用版本戳方案:
- 服务端读取JSON文件的修改时间作为版本号,渲染前端页面时把版本号传给前端
$jsonVersion = filemtime(ROOT . "/data/venues.json"); // 输出到前端JS变量 echo "<script>const VENUES_DATA_VERSION = {$jsonVersion};</script>"; - 前端请求数据时带上版本参数:
fetch('/your-api-path.php?v=' + VENUES_DATA_VERSION)
只要JSON文件更新,版本号就会变动,浏览器会视为全新资源发起请求,不会复用旧缓存,同时未更新时可以正常复用缓存降低服务器负载。
内容的提问来源于stack exchange,提问作者Kirk Ross
相关产品推荐
相关产品推荐

