缩小动态php样式表

时间:2011-07-05 13:32:30

标签: php css dynamic stylesheet minify

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

我尝试使用htaccess来欺骗它以为它是一个css文件,但我意识到它使用的绝对文件路径不会受到mod_rewrite的影响

无论何时,只要我将它指向一个php文件,它总会返回'400 Bad Request'。除了编写自己的压缩脚本之外,还有任何关于如何解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:7)

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

<?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逻辑包含或不包含它们。
  • 允许您根据需要保持源样式表的间隔和注释,而不会给访问者带来任何后果。

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

将此技术与此缓存控制技术结合使用,您已经构建了一个非常棒的CSS / JS处理程序:How to force browser to reload cached CSS/JS files?