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

PHP磁盘缓存优化:如何忽略URL查询参数生成统一缓存文件

PHP磁盘缓存优化:如何忽略URL查询参数生成统一缓存文件

嗨,我完全懂你的困扰——现在的缓存逻辑会把URL里的查询参数都带到缓存文件名里,导致同一个页面因为参数不同生成一堆重复的缓存文件,这完全违背了你想节省CPU的初衷对吧?别担心,只需要调整一下获取文件名的逻辑就能解决这个问题。

问题根源

你说得没错,问题就出在$file变量的获取上:原来的代码直接取了URL路径的最后一段,这会把查询参数(比如?sdgd=3534)也包含进去,所以生成的缓存文件名会带上这些参数。我们需要把纯文件名和查询参数分离开,只保留前者。

解决方案

修改获取$file的代码,把查询参数部分剥离掉就行,这里有两种简单的实现方式:

方式一:用explode快速拆分

直接把文件名和?后面的内容切开,只取前面的纯文件名:

$url = $_SERVER['DOCUMENT_ROOT'].$_SERVER["REQUEST_URI"];
$break = Explode('/', $url);
$file = $break[count($break) - 1];

// 新增这一行:分离文件名与查询参数,只保留纯文件名
$file = explode('?', $file)[0];

$cachefile = 'cache/cached-'.$file.'.html';
$cachetime = 900;

// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    // echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n";
    readfile($cachefile);
    exit;
}

ob_start();

方式二:用parse_url更规范处理

如果想更健壮地处理各种URL情况(比如路径里有特殊字符),可以用PHP的parse_url函数来提取路径,再取文件名:

$uriParts = parse_url($_SERVER["REQUEST_URI"]);
// 从路径中提取纯文件名
$file = basename($uriParts['path']);

$cachefile = 'cache/cached-'.$file.'.html';
$cachetime = 900;

// 后续缓存逻辑不变...

额外说明

  • 关于URL中的#锚点:不用担心这部分,因为浏览器不会把锚点内容发送给服务器,$_SERVER["REQUEST_URI"]里根本不会包含#及后面的内容,所以不需要额外处理。
  • 注意权限:确保你的cache目录有服务器用户的写入权限,不然缓存文件无法生成。
  • 特殊场景提醒:如果你的页面会根据查询参数显示不同内容,那这种统一缓存的方式就不适用了——但如果不管参数如何,页面内容都是一致的,那这个方案完美符合你的需求。

备注:内容来源于stack exchange,提问作者Johnny Bravo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:00:27