用于通过php提供css的php标头

时间:2012-06-22 11:28:16

标签: php css caching

这就是事情。 我正在提供一些压缩的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。

5 个答案:

答案 0 :(得分: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:)

答案 1 :(得分:1)

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

如果您真的无法将修改后的日期附加到HTML,那么最好的替代方法是通过PHP设置缓存标头。

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

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

答案 2 :(得分:1)

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

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

您可以看到更多information about headers in PHP's official documentation

答案 3 :(得分: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.php的任何请求路由到loader.css.php

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

答案 4 :(得分:0)

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