1

事情就是这样。我正在提供一些压缩的 CSS 内容

(`str_replace(array("\r", "\n", "\t", '\s\s+'), '', cssGoesHere)`) 

通过我页面中的 PHP 文件:

<link rel="stylesheet" type="text/css" href="/css/loader.css.php" />

问题是:如何让浏览器缓存返回的 css,但如果内容发生更改则更新缓存?

PHP文件没有被修改,所以附加类似的东西

<?php echo filemtime('/css/loader.css.php'); ?>

href属性不是一个选项。这可以通过标题解决吗?如果可以,如何解决?因为 AFAIK 如果我像上面写的那样提供它,浏览器只会缓存结果并继续重用缓存(当然,前提是浏览器已启用/能够这样做),但我需要它知道内容何时改变了。

编辑:我用我的代码制作了一个 github 项目(尽管自从我写了这篇文章以来,我确实对它进行了很多更改以获得更大的灵活性)。这是链接:https
://github.com/jurchiks/YACC 如果您有任何建议,请将它们写到我的电子邮件或smth。

4

5 回答 5

1

您可以将版本号添加到 CSS 链接 href 并使用 mod rewrite 将其路由回原始 CSS 文件。

例如。假设您从版本 1 开始(请注意文件名的版本附录):

<link rel="stylesheet" type="text/css" href="/css/loader-v001.css.php" />

浏览器会缓存这个文件。下次更新 CSS 文件并且不希望浏览器使用缓存文件时,只需像这样更改版本号:

<link rel="stylesheet" type="text/css" href="/css/loader-v002.css.php" />

然后,在您的 mod 重写中,将对文件的任何请求路由loader-v{x}.css.phploader.css.php.

我不确定这是否足以满足您的需求,因为它确实需要手动更改版本号。但是,不同的文件名将确保浏览器将其视为实际的“新”文件并重新下载。

于 2012-06-22T13:21:56.310 回答
1

它可以通过标头缓存控制来解决,但事实证明这不是很有效。因为某些浏览器会覆盖或修改您的强制设置。

我看不到您从哪里获取 CSS 数据,如果它是 CSS 文件,您可以获取 css 文件的 filemtime 作为版本指示符,或者只是在某处提供每次 CSS 文件更改时必须更改的版本字符串。

顺便说一句,str_replace(array("\r", "\n", "\t", '\s\s+'), 并不能有效地删除所有换行符。你应该使用类似的东西

$foo = nl2br($string, FALSE);
$bar = str_replace(array('<br>', '\s\s+'), '', cssGoesHere)

反而。

HTH :)

于 2012-06-22T11:36:05.277 回答
1

在更改时可靠地加载文件的唯一方法是您声明的方法。否则,页面将缓存文件并在它认为必要的时候保留它。如果不请求和下载至少标题,它就无法检查页面是否已更改,如果它已经消失那么远,它可能只下载页面的其余部分,因为带宽将是最小的。

如果您真的无法将修改日期附加到 HTML,最好的选择是通过 PHP 设置缓存标头。

header("Cache-Control: max-age=time-in-seconds");

但是,这并不总是有效,因为服务器设置和浏览器设置可以覆盖它,尤其是在激进的缓存浏览器(如 Internet Explorer)中。

于 2012-06-22T11:38:16.007 回答
1

在您的 css php 页面中使用它:

header('Content-type: text/css');
header("Cache-Control: no-cache, must-revalidate");

您可以在 PHP 的官方文档中查看有关标头的更多信息

于 2012-06-22T11:39:58.457 回答
0

我建议保留生成缓存内容的时间,例如 style.php 保存 CSS 数据的最后一次修改时间是 2012 年 6 月 21 日,缓存内容最后一次生成时间是 2012 年 6 月 20 日运行日期比较在 strtotime() 整数中,您会看到缓存的内容必须从新内容再次生成。

于 2012-06-22T11:39:28.423 回答