我已经学习了一些关于如何gzip一个css文件的教程,你可以在其中创建一个公共php文件来包含带压缩的css文件。问题是我无法让它缓存我的css文件。我正在使用firebug作为参考,我实际上尝试使用相同的代码来压缩一些javascript并且它缓存它。
以下是代码:
if(extension_loaded('zlib')){ ob_start('ob_gzhandler'); } $offset = 60 * 60 * 24 * 31; header('Content-type: text/css'); header ('Cache-Control: max-age=' . $offset . ', must-revalidate'); header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); ob_start("compress"); function compress($buffer) { // Remove Comments, White Space, End ;'s $buffer = preg_replace('#/\*.*?\*/#s', '', $buffer); $buffer = preg_replace('/\s*([{}|:;,])\s+/', '$1', $buffer); $buffer = preg_replace('/\s\s+(.*)/', '$1', $buffer); $buffer = str_replace(';}', '}', $buffer); $buffer = str_replace(' {', '{', $buffer); return $buffer; } include('global.css'); if(extension_loaded('zlib')){ ob_end_flush(); }
然后我只是将我的php文件作为css文档引用到其他页面上。 正如你所看到的,我已经尝试将最大年龄添加到混合中,这也证明是不成功的。
以下是回复标题
Date Tue, 21 Jul 2009 19:59:19 GMT Server Apache/1.3.41 (Darwin) PHP/4.4.9 X-Powered-By PHP/4.4.9 Cache-Control max-age=2592000, must-revalidate Expires Thu, 20 Aug 2009 19:59:19 GMT Content-Encoding gzip Vary Accept-Encoding Keep-Alive timeout=15, max=93 Connection Keep-Alive Transfer-Encoding chunked Content-Type text/css
我有什么遗漏,或者更好的方法吗?
谢谢,
编辑:
检测文件是否已更改的脚本&发送304(如果没有),结合正确的标题已解决了这个问题。
亚瑟
答案 0 :(得分:7)
尝试将此添加到标题集: -
$offset = 60 * 60 * 24;
header('Content-type: text/css');
header('Cache-Control: max-age=' . $offset);
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT');
header('Last-Modified: ' . gmdate ("D, d M Y H:i:s", time()) . ' GMT');
问题是缓存控制标头中的must-revalidate
指令。这将导致客户端在每次需要时重新请求css,并且您的代码没有处理If-Modified-Since标头和发送304未修改的响应状态代码。
上述方法将缓存周期缩短为1天,并取消了必须重新生效的指令。它还添加了Last-Modified标头(当缺少Last-Modified或ETag标头时,缓存可以选择不缓存项目。)
要改进这一点,您可以找到正在压缩的css文件的实际上次修改时间,并将其作为Last-Modified标头发送。您可以在代码中包含请求If-Modified-Since标头与上次修改时间的css文件值的比较。如果你发现它们同样发送这组标题,但也发送304 Unmodfied状态,并且根本不发送正文。 (我不是一个真正的PHP人员,所以我会把它留给PHP专家来另一个答案)。
在客户端必须再次尝试检索css并相应地设置max-age值之前,要对客户端缓存css的时间进行实际评估。
答案 1 :(得分:-1)
如果您阅读python / django,则可以阅读django compressor的代码。它将多个CSS文件合二为一。 CSS部分看起来像是启动CSSTidy来清理CSS。