在浏览器中强制缓存更新

时间:2014-04-09 09:52:01

标签: php browser-cache minify

我正在使用Minify(https://code.google.com/p/minify/)来压缩和组合~30个css文件和~10个javascript文件。我为这些文件创建了一个组配置,它基本上是一个带有文件名的数组。

像魅力一样工作,除非修改其中一个脚本:浏览器缓存未及时更新。我曾经为每个文件(使用filemtime)获取最后修改的时间戳,以取代浏览器缓存:

$time = '?' . filemtime( $filename );
$output = '<link type="text/css" rel="stylesheet" href="'.$file_path.'?'.$time.'" />';

我可以遍历所有40个文件以获取最新的时间戳,但这是一个非常难看的解决方案。另一种方式是例如有一个crobjob检查它并将时间戳写入文件,然后我可以包括。

在我再次发明轮子之前还有其他方法吗?

3 个答案:

答案 0 :(得分:0)

你能不能只添加:

src="path/to/file.css?v=<?php date(dmy); ?>"

答案 1 :(得分:0)

只需获得$file_path的修改时间......?就个人而言,我有更多合理数量的文件(两个或三个),每个文件都使用mtime单独缓存。工作得很漂亮。

答案 2 :(得分:0)

我可以建议您一种方法,您需要定义重写规则并实现静态文件加载的处理程序。假设它是assethandler.php,并且是你的重写规则;

RewriteRule ^nocache/(.*?)$ assethandler.php?f=$1 [QSA,L]

在php中,您可以使用Cache-Control and Expires获取最新文件;

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 01 Jul 1990 05:00:00 GMT"); // past date
readfile('path_to_static_files/' . $_GET['f']);

,你的静态文件请求就像;

<script src="nocache/your.js"/>

简单地说,当您向nocache/filename发出请求时,这将作为assethandler.php?f=filename处理,在此处理程序中,缓存始终被禁用,文件内容作为最新内容