2010-08-12 131 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变量由你掌控。它应该在站点范围的配置文件中设置。每次您直接推送更新时,您都可以在一个地方更改版本,每个看到新内容的人都会推送它,而不依赖于缓存。