2011-07-05 22 views
2

所以我一直在使用Minify来压缩我的JS和CSS,它们都很好,直到我需要压缩一些动态的php样式表。缩小动态php样式表

我试图用htaccess的将它误以为它是一个CSS文件,但后来我意识到它使用了不会被mod_rewrite的

来实现绝对文件路径,反正只要我点它在一个PHP文件,它总是返回'400错误请求'。除了编写我自己的压缩脚本之外,如何解决这个问题的任何想法?

+0

什么是动态的,PHP的样式? –

+0

所以你想使用一个与平面文件一起工作的工具来压缩动态创建的东西。这听起来有点不对..你不可能? :) –

+0

我将这添加为注释,因为它是在黑暗中刺:尝试制作一个静态css文件,然后在那里包括动态的与@import语句,然后缩小静态。如果它有效,让我知道我会将它添加为答案;)顺便说一句,我知道你应该避免@import,但嘿。 – picus

回答

6

我发现处理缩小和压缩样式表的最好方法就是自己动手。看看这个代码:

<?php 
header("Content-Type: text/css"); 
header("Last-Modified: ".gmdate('D, d M Y H:i:s', filemtime($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']))." GMT"); 
header("Expires: ".gmdate('D, d M Y H:i:s', (filemtime($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']) + 691200))." GMT"); 

//This GZIPs the CSS for transmission to the user 
//making file size smaller and transfer rate quicker 
ob_start("ob_gzhandler"); 
ob_start("compress"); 

//Function for compressing the CSS as tightly as possible 
function compress($buffer) { 
    //Remove CSS comments 
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); 
    //Remove tabs, spaces, newlines, etc. 
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); 
    return $buffer; 
} 

//Main style 
require_once($_SERVER['DOCUMENT_ROOT']."/templates/style/style.css"); 

//Other style 
if($php_variable) { 
    require_once($_SERVER['DOCUMENT_ROOT']."/templates/style/other.css"); 
} 

ob_end_flush(); 
ob_end_flush(); 
?> 

这里有很多事情正在进行,所以让我解释一下。

  • 设置文件类型为CSS。
  • 设置缓存控制的Last-ModifiedExpires标题(设置稍微超过一周,您可以更改此设置)。

缩减大小和GZIP

  • 使用ob_start,我们告诉它GZIP文件以及运行自定义功能compress
  • compress发送到浏览器时删除所有CSS注释和空格。这意味着您可以将所有评论和间隔保持在源文件中,以便于编辑,但只能将最低限度的内容发送到浏览器。

风格

  • 使用require导入样式表。按照你的意愿去做尽可能多的样式表;他们将全部通过一个HTTP请求交付给用户。

使用新文件

你会在文件中调用,就像你一个正常的CSS文件。

<style type="text/css" src="/path/to/css-script.php"></style> 

结论

使用这种方法,你正在做几件事情真棒。

  • 为缓存提供正确的标题,使您可以快速访问您的网站。
  • Minifys的所有内容不包含额外的空白或评论。
  • 使用GZIP压缩文件以获得更小的文件大小。
  • 在一个HTTP请求中包含所有样式表,非常适合优化。
  • 避免使用@import声明......这本身就非常棒。
  • 允许您保留多个样式表并使用PHP逻辑来包含或不包含它们。
  • 允许你保持你的源代码样式表的间隔和评论,只要你喜欢,对访问者没有任何影响。

虽然上面的compress函数严格用于CSS,所以我会省略它,但您也可以对JavaScript使用相同的方法。

使用此技术在这个高速缓存控制技术相结合,并且你已经建立了自己的真棒CSS/JS处理程序:How to force browser to reload cached CSS/JS files?

+1

我不得不适应这一点我自己。 Minify对CSS非常慢。 – timw4mail

+0

哈完美的答案,很好的一个章节:)希望我可以给你奖励积分过度使用这个词真棒:P – Horse

+0

只是为了说明,不会与safari一起工作,因为缺乏gzip支持 – Horse