2010-08-12 159 views
2

現在我使用PHP腳本將多個CSS文件合併爲一個腳本,然後使用內容類型的文本/ css輸出它們。合併多個CSS文件

他們遇到的問題是瀏覽器不會緩存文件。

有沒有更好的方法來做到這一點?

感謝

+0

你發送了哪些緩存標題?瀏覽器是否設置爲緩存文件? – Douglas 2010-08-12 23:10:24

+0

您可以運行一次PHP腳本並將輸出保存爲服務器上的文件。這種方式的開銷較少,緩存應該是開箱即用的。 – cbednarski 2010-08-13 01:58:17

回答

2

如果你有才能通過PHP的CSS,你可以強制緩存頭被髮射,因此瀏覽器可以緩存輸出如果願意:

<?php 

    header('Cache-control: max-age=3600'); // cache for at least 1 hour 
    header('Content-type: text/css'); 

    readfile('css1.css'); 
    readfile('css2.css'); 
    etc... 
2

你爲什麼不只是使用@import在全局CSS文件,並鏈接到你的HTML文件?

看到:http://www.cssnewbie.com/css-import-rule/

+0

公平地說,在某些情況下創建單個文件可以獲得性能上的提升,只要他解決了緩存問題(並且還會發現性能損失,這是一個應該衡量的折衷事項)。 – 2010-08-12 23:42:58

1

「層疊樣式表」 之前CSS文件可能include別人都這麼叫。您也可以在HTML文件中指定幾個CSS文件(使用LINK),而不是將它們內聯。

使用這些工具,讓您的Web服務器負責爲客戶端緩存發送適當的頭文件,以處理條件HTTP請求。

0

我使用的代碼發佈波紋管。

它遵循Google的頁面速度建議。

請注意readfileinclude更快,因此應該使用。

<?php 
#$off = 0; # Set to a reasonable value later, say 3600 (1h); 
$off = 604800; # Set to 1 week cache as suggested by google 

$last_modified_time = filemtime('csscompressor.php'); 
$etag = md5_file('csscompressor.php'); 

ob_start("ob_gzhandler"); 
ob_start("compress"); 
header('Content-type: text/css; charset="utf-8"', true); 
header("Cache-Control: private, x-gzip-ok=''"); 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $off) . " GMT"); 

// load css files 
readfile("global.css"); 
readfile('jquery-theme.css'); 
// ... 

?> 

你也應該服務於所有的CSS和JavaScript的網頁是這樣的:

<script src="http://example.com/myjavascript.js?v=<?=$version=?>" ></script> 

$version變量由你掌控。它應該在站點範圍的配置文件中設置。每次您直接推送更新時,您都可以在一個地方更改版本,每個看到新內容的人都會推送它,而不依賴於緩存。