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
相关产品推荐
相关产品推荐

