使用PHP在CSS样式表中创建变量有哪些缺点?

6
CSS的一个显著缺点是无法使用变量。例如,我想使用变量来控制导入CSS的位置,并且创建用于在设计中重复使用的颜色变量将非常棒。
一种方法是使用PHP文件作为CSS样式表。换句话说,创建一个名为“style.php”的文件,并在文件顶部添加以下内容: 然后,在任何使用这些样式的文件中使用以下链接: 那么问题来了,有什么损失吗?我认为可能是性能——我在Firefox / Firebug中进行了一些快速实验,正如人们所预期的那样,CSS样式表被缓存,但PHP样式表不会。因此,我们要付出额外的GET代价。
另一个让人烦恼的事情是,TextMate不能正确地对.php文件中的CSS进行语法高亮显示。
还有其他缺点吗?您是否使用过这种方法?如果使用过,您会推荐它吗?

1
你可以在 PHP 脚本中设置 Last-Modified: 头,让浏览器知道它不需要重新加载。(当然,如果需要重新加载,则除外) - amphetamachine
4个回答

7

性能就是一切。这是一个好主意,但只有在缓存时才有效。您可以发送浏览器标头来请求客户端缓存,但如果性能是一个问题,您可能会从开发一个系统中受益,通过该系统将启用PHP的样式表编译为普通的CSS文件以作为正常服务。

不过,如果您打算手动编译自己的系统,您可能需要考虑使用SASS代替。


1
在服务器上缓存PHP输出并不是一个坏主意,因为您可以执行其他优化,例如将样式表链接在一起并对文件进行gzip/minify。 - Annika Backstrom
把它写入CSS文件,然后包含该文件怎么样?并且只在更新时重写文件? - David Hobs

2
你仍然应该能够设置适当的HTTP头部来指示浏览器缓存动态生成的CSS。你可能会对以下Google Code文章感兴趣,进一步了解这个主题: 你也可以考虑从你的脚本生成一个静态的CSS文件,然后在你的web文档中包含它。这样可以消除实时预处理和与此相关的任何性能问题,但代价是每当更改CSS文件时就必须"编译"它们。然而,如果你已经 缩小CSS或JavaScript,你可以把这个额外的步骤简单地添加到你的构建过程中。
至于代码高亮,你可能想使用具有变量而不是硬编码常量的普通CSS文件。然后你的PHP预处理器可以加载CSS文件并将变量替换为实际值。

一方面这是一个好的答案,另一方面它使用了“杠杆”这个词。不过还是点赞 :p - Artefacto
Daniel,谢谢,但我不理解这部分...“你可能想使用普通的CSS文件,其中包含变量,而不是硬编码常量”。你是指给文件一个css扩展名吗?我认为在这种情况下预处理器不会被调用。我一定漏掉了什么。 - Greg
@Greg: 你可以给它一个CSS扩展名,然后可以使用类似style.php?file=mystyles.css的方式调用预处理器。预处理器可以从文件系统加载文件并进行处理。 - Daniel Vassallo

1
缺点是该文件不被缓存(正如你所指出的),而且服务器必须为每个请求计算CSS文件。
对于服务器来说,加载静态文件几乎没有负载,因为它只会读取并转储文件,但对于PHP脚本,它将不得不为每个页面请求执行它,这可能会增加额外的开销。
您可能可以将CSS缓存在内存或Memcache中,但仍然不像使用静态文件那样高效。
为什么不在静态文件中定义大部分CSS,然后仅覆盖更改的特定样式呢?

谢谢webdestroya。实际上,我正在将“大部分CSS内容放在一个静态文件中,并只覆盖那些需要改变的特定样式”,但如果能够在一个地方指定某些颜色和样式,并使它们在整个设计中传播,那将会更加方便、高效(并且更不易重复)。 - Greg

0

这并不是一个确切的答案,而是对@Matchu答案的补充。
以下是我几年前使用过的代码片段,您可以以此为基础开始制定自己的客户端缓存规则方法。欢迎任何感觉可以改进它的人。

<?php

//functions to cache HTML output Or JS/CSS output from a PHP script

class ControlHtmlCache

{

    //Will cache output of a php script on the browser for the giver hours.

    //Do notice, this will not cahce from now until now+hours, but rather for a rounded time period in the time stamp

    //For example, If I send 4 it will refresh the cache at approx 3,7,11,15,19,23 (In the summer, it will be 4,8,12....)

    static function client_side_cache($hours)

    {

        //in the event a session start is used, I have to clean all the #$%# headers it sends to prevent caching

        header('Cache-Control: ',true);

        header("Pragma: ", true);

        header("Expires: ", true);



        //get the If-Modified-Since header in a unix time format

        $headers = getallheaders();

        if (isset($headers['If-Modified-Since']))

        {

            $modifiedSince = explode(';', $headers['If-Modified-Since']);

            $modifiedSince = strtotime($modifiedSince[0]);

        }

        else

        {

            $modifiedSince = 0;

        }



        //calculate the Last-Modified timestamp

        $current_time=time();

        $last_modified=($current_time)/($hours*3600);

        $last_modified=(int)$last_modified;

        $last_modified=$last_modified*$hours*3600;



        //check cache not expires

        if ($last_modified <= $modifiedSince)

        {

            header('HTTP/1.1 304 Not Modified');

            exit();

        }

        else //emit a new Last-Modified (either cache expired or page wasn'r cached

        {

            Header('Last-Modified: '.gmdate("D, d M Y H:i:s",$last_modified).' GMT ');

        }

    }

}//EOF class

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