2009-07-21 85 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