2009-07-21 47 views
7

我已经了解了如何gzip一个css文件,其中创建了一个公共php文件以包含压缩的css文件。问题是我无法让它缓存我的CSS文件。我使用的是Firebug的参考,我实际上已经尝试使用相同的代码来压缩一些JavaScript,并缓存它很好。缓存gzipped css

下面是代码:

 
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如果还没有,在适当头相结合,解决了这个问题的脚本。

亚瑟

回答

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 Unmodified响应状态码。

上述方法将高速缓存周期减少到1天,并取消了必须重新验证的指令。它还添加了Last-Modified标头(当Last-Modified或ETag标头丢失时,缓存可能会选择不缓存项目)。

为了改善这一点,您可以找到正在压缩的css文件的实际上次修改时间,并将其作为Last-Modified标头发送。您可以在代码中包含If-Modified-Since标题与css文件最后修改时间值的比较。如果你发现它们同样发送这组标题,但也发送一个304 Unmodfied状态,并且根本不发送该主体。 (我不是一个真正的PHP人员,所以我会把它留给PHP专家放在另一个答案中)。

对您希望客户端缓存css的时间进行实际评估,然后再尝试检索它并相应地设置最大年龄值。

+0

嘿安东尼, 我已经尝试添加最后修改,就像你建议与后期和以前的修改日期的组合,没有运气。 我也通过ETag发送标头,如果修改后,它仍然没有缓存... 感谢您的回复,我将把所有这些记在心,以备将来参考和调试。 – askon 2009-07-21 20:53:07

-1

如果你读的python/Django的,你可以阅读代码django compressor。它将多个CSS文件合并为一个。 CSS部分看起来像启动了CSSTidy来清理CSS。

+0

2014-12-03:嗨,@downvoter,谢谢你停下来,并给你一个5年半的答案的想法。 – hughdbrown 2014-12-03 20:27:20