Каковы недостатки использования PHP для создания переменных в моей таблице стилей CSS? - PullRequest
6 голосов
/ 01 июня 2010

Одним существенным недостатком CSS является то, что нельзя использовать переменные. Например, я хотел бы использовать переменные для управления местоположением импортированного CSS, и было бы здорово создать переменные для цветов, которые многократно используются в дизайне.

Одним из подходов является использование файла PHP для таблицы стилей CSS. Другими словами, создайте "style.php" с ...

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

... вверху файла, а затем ссылку на него, используя ...

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

... в любом файле, который использует эти стили.

Так в чем же подвох? Я думаю, это может быть производительность - я провел несколько быстрых экспериментов в Firefox / Firebug и, как и следовало ожидать, таблица стилей CSS кэшируется, а таблица стилей PHP - нет. Таким образом, мы платим цену дополнительного GET.

Другая неприятная вещь заключается в том, что TextMate неправильно выделяет синтаксис для CSS в файле .php.

Есть ли другие недостатки? Использовали ли вы этот подход, и если да, то порекомендуете ли вы его?

Ответы [ 4 ]

7 голосов
/ 01 июня 2010

Производительность в значительной степени это. Это хорошая идея, но только если вы ее кешируете. Вы можете разослать заголовки браузера, чтобы попросить клиента хорошенько его кешировать, но если производительность является проблемой, вы могли бы выиграть от разработки системы, с помощью которой вы компилируете свои таблицы стилей с поддержкой PHP в обычные CSS-файлы для нормальной работы.

Если вы хотите потрудиться накатить свою собственную систему компиляции, вы можете вместо этого заглянуть в SASS .

2 голосов
/ 01 июня 2010

Вы все еще должны иметь возможность установить соответствующие заголовки HTTP, чтобы дать указание браузеру кэшировать динамически генерируемый CSS. Возможно, вас заинтересует следующая статья Google Code для дальнейшего чтения по этой теме:

Вы также можете создать статический CSS-файл из своего скрипта, а затем включить его в свой веб-документ. Это исключает предварительную обработку в реальном времени и любые проблемы с производительностью, связанные с этим, за счет необходимости «компилировать» ваши CSS-файлы всякий раз, когда вы их изменяете. Однако, если вы уже минимизируете CSS или JavaScript, вы можете просто добавить этот дополнительный шаг в процесс сборки.

Что касается выделения кода, вы можете использовать обычные CSS-файлы с переменными в них вместо жестко закодированных констант. Затем ваш препроцессор php может загрузить файл CSS и заменить переменные фактическими значениями.

1 голос
/ 01 июня 2010

Недостатком является то, что файл не кэшируется (как вы указали), а также тот факт, что сервер должен вычислять файл CSS для каждого запроса.

Загрузка статического файла практически не загружается для сервера, поскольку он просто читает и выгружает файл, но для сценария PHP ему придется выполнять его для каждого запроса страницы, что может привести к дополнительным расходам.

Возможно, вы можете кэшировать CSS в памяти, Memcache или что-то в этом роде, но это все равно не будет эффективным, как просто использование статического файла.

Почему бы не определить большую часть вашего CSS в статическом файле, а затем просто переопределить конкретные стили, которые меняются?

0 голосов
/ 01 июня 2010

Не совсем ответ, но дополнение к ответу @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...