CSS预处理器还是PHP?

6
如果我正在使用PHP编写代码,那么为什么我要使用CSS预处理器而不是PHP呢?例如,我可以通过在头部添加以下内容来在我的CSS文件中使用PHP:
<link rel="stylesheet" type="text/css" media="all" href="style.php" />

那么我可以像这样传递变量:style.php?color=#000 或者我可以使用LESS来预处理我的CSS文件。如果我使用less.js,我不确定如何像上一个例子中那样传递变量。
现在,我听说PHP CSS文件无法缓存,所以我可以理解为什么会有问题,特别是如果CSS文件很大的话。但我想要能够向我的CSS表单传递变量。
有人能告诉我为什么我应该使用其中之一,和/或者如果我使用less.js,我如何向我的.less文件传递变量呢?

2
你可以使用 LESS PHP 编译器,它允许处理 CSS 字符串或整个文件。 - Bojangles
我推荐使用Stylus而非LESS。你可以通过预处理器的“包含其他文件”的功能来包含设置“变量”的PHP文件,但正如你所说,这样做会破坏缓存。你可能希望通过Javascript设置“变量”以在CSS上产生效果,而不是在CSS本身中设置。 - Borealid
2
PHP CSS可以被缓存,你需要设置适当的头部信息和/或使用基于文件的缓存。 - MacMac
3个回答

4
现在,我听说PHP CSS文件不能被缓存,所以我可以理解这会是一个问题,特别是如果CSS文件很大的话。
PHP CSS文件是可以被缓存的,但如果您向它们传递动态值,则缓存的意义通常就失去了。如果您有一个可能随每个请求而更改的动态值,则缓存变得毫无意义。
此外,将大量主要为静态的CSS通过PHP预处理器推送通常是浪费服务器资源的行为。
更简单的方法通常是使用静态CSS文件,并在页面正文中声明所有动态值:
<!-- the static style sheet declares all the static values --> 
<link rel="stylesheet" type="text/css" href="static.css"> 
<!-- now you override all the dynamic values -->
<style>
  .classname { color: <?php echo $color; ?> }
</style>

这样,你就可以随心所欲地设置动态值,同时避免PHP处理大量CSS数据。

Pekka,在存在多个页面的环境中使用此方案并不是一个好主意。您会失去 .css 的核心功能,即完全避免在整个站点中出现 <style> 条目。很抱歉仅因这一点而对其进行了负面评价。 - Ahmed Masud
2
@Ahmed Masud:如果动态样式在每个页面的基础上不同,那么这是最好的方法。网站不一定需要一个单独的样式表来涵盖所有情况。 - BoltClock
1
@Ahmed,请给我展示一个比这个更好的动态CSS实现(请注意,这是关于每个请求都可以更改的值)。这是唯一一种情况,其中<style>条目非常适合。 - Pekka
通常情况下,您不需要关心,因为浏览器会自动处理。在这种情况下,您甚至都不需要担心。 - hakre
1
@Pekka:您首先在讨论其他事情,所以请不要误读我写的内容。我没有说您应该膨胀无法缓存的部分,只是GET请求即使添加了查询参数也可以被缓存。也可以不添加另一个样式表,而是向body元素添加另一个类,缓存样式表根据需要应用规则。 - hakre
显示剩余4条评论

3
任何HTTP请求都可以被缓存,只需生成适当的缓存头请参阅rfc2616
有趣的是,如果您的GET值发生更改,则无论如何都不希望PHP被缓存,因此缓存将非常有效。所以尽管使用它们。
你的CSS的一部分应该像这样:
<?php
     header("Content-type: text/css");
?>

这里有一个非常有趣的教程:http://css-tricks.com/snippets/php/intelligent-php-cache-control/


"...你无论如何都不希望PHP被缓存" - 这正是为什么如果您的动态值可以根据用户甚至页面而更改,那么这不是一个好方法的原因。如果您有10个值的更改,用户的浏览器将被迫加载样式表10次。 - Pekka

1

除了浏览器缓存之外,静态文件更适合用于服务器端缓存:

静态CSS文件可以被缓存在内存中(甚至可以在一些像nginx这样的服务器上进行预压缩),这使得您可以从无cookie的静态服务域提供它们。使用像nginx这样的Web服务器可以创建巨大的性能提升,因为使用的RAM更少。如果您没有太多的RAM或者有很多的流量,那么差异可能是巨大的。

如果您有一个小网站,那么这并不重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接