代码之家  ›  专栏  ›  技术社区  ›  Greg

使用PHP在我的CSS样式表中创建变量有什么缺点?

  •  6
  • Greg  · 技术社区  · 14 年前

    CSS的一个显著缺点是不能使用变量。例如,我想使用变量来控制导入的CSS的位置,并且为设计中反复使用的颜色创建变量将是非常棒的。

    一种方法是为CSS样式表使用PHP文件。换句话说,用…

    <?php header("Content-type: text/css"); ?>

    …在文件顶部,然后使用…

    <link href="style.php" rel="stylesheet" type="text/css" />

    …在任何使用这些样式的文件中。

    那么有什么收获呢?我认为这可能是性能问题——我在firefox/firebug上做了一些快速的实验,正如人们所预期的那样,CSS样式表是缓存的,但是PHP样式表不是缓存的。所以我们要支付额外的get的价格。

    另一件烦人的事情是,textmate没有在.php文件中为css正确地突出显示语法。

    还有其他的缺点吗? 你使用过这种方法吗?如果是,你会推荐它吗?

    4 回复  |  直到 14 年前
        1
  •  7
  •   Matchu    14 年前

    性能就是它。这是一个好主意,但只有当你缓存它。您可以发送浏览器头,要求客户机缓存它,但如果性能是一个问题,您可能会受益于开发一个系统,通过该系统,您可以将启用了PHP的样式表编译为普通的CSS文件,使其正常工作。

    不过,如果您想手工编写自己的编译系统,您可能需要研究一下 SASS 相反。

        2
  •  2
  •   Daniel Vassallo    14 年前

    您仍然可以设置适当的HTTP头来指示浏览器缓存动态生成的CSS。您可能有兴趣查看以下谷歌代码文章,以进一步阅读该主题:

    您还可以考虑从脚本生成一个静态的CSS文件,然后从Web文档中包含该文件。这就消除了与此相关的实时预处理和任何性能问题,代价是每次更改CSS文件时都必须“编译”它们。但是如果你已经 minifying CSS或JavaScript,您可以简单地将这个额外的步骤添加到您的构建过程中。

    至于代码突出显示,您可能希望使用包含变量的普通CSS文件,而不是硬编码常量。然后,您的PHP预处理器可以加载CSS文件并用变量替换实际值。

        3
  •  1
  •   Mitch Dempsey    14 年前

    缺点是该文件没有被缓存(如您所指出的),而且服务器必须为每个请求计算CSS文件。

    加载静态文件对于服务器来说几乎是没有负载的,因为它只是读取和转储文件,但是对于PHP脚本,它必须为每个页面请求执行它,这可能会增加额外的开销。

    您可以将CSS缓存在内存、memcache或其他地方,但这仍然不如仅使用静态文件那么有效。

    为什么不在一个静态文件中定义大多数CSS,然后只重写那些更改的特定样式呢?

        4
  •  0
  •   Itay Moav -Malimovka    14 年前

    不完全是一个答案,而是对@matchu answer的一个补充。
    这是我几年前使用的一个代码sni[et,您可以从这个基础上开始开发自己的客户端缓存规则方法。任何认为他能改进的人,都欢迎。

    <?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