Кэширование сжатых css - PullRequest
       14

Кэширование сжатых css

8 голосов
/ 21 июля 2009

Я прочитал несколько уроков о том, как сжать CSS-файл, в котором вы создаете публичный php-файл, чтобы включить css-файлы со сжатием. Проблема в том, что я не могу заставить его кэшировать мои CSS-файлы. Я использую Firebug для справки, и я на самом деле пытался использовать тот же код для сжатия некоторого JavaScript, и он отлично кеширует.

Вот код:

if(extension_loaded('zlib')){
ob_start('ob_gzhandler');
}
$offset = 60 * 60 * 24 * 31;
header('Content-type: text/css');
header ('Cache-Control: max-age=' . $offset . ', must-revalidate');
header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT');
ob_start("compress");
function compress($buffer) {
    // Remove Comments, White Space, End ;'s
    $buffer = preg_replace('#/\*.*?\*/#s', '', $buffer);
    $buffer = preg_replace('/\s*([{}|:;,])\s+/', '$1', $buffer);
    $buffer = preg_replace('/\s\s+(.*)/', '$1', $buffer);
    $buffer = str_replace(';}', '}', $buffer);
    $buffer = str_replace(' {', '{', $buffer);
    return $buffer;
    }

    include('global.css');

    if(extension_loaded('zlib')){
    ob_end_flush();
}

Тогда я просто называю свой php-файл документом css на других страницах. Как вы можете видеть, я пытался добавить максимальный возраст к миксу, который также оказался неудачным.

Вот заголовки ответа

Date    
Tue, 21 Jul 2009 19:59:19 GMT

Server  
Apache/1.3.41 (Darwin) PHP/4.4.9

X-Powered-By    
PHP/4.4.9

Cache-Control   
max-age=2592000, must-revalidate

Expires 
Thu, 20 Aug 2009 19:59:19 GMT

Content-Encoding    
gzip

Vary    
Accept-Encoding

Keep-Alive  
timeout=15, max=93

Connection  
Keep-Alive

Transfer-Encoding   
chunked

Content-Type    
text/css

Есть ли что-то, что я пропускаю, или лучший способ сделать это?

Спасибо

EDIT:

Сценарий, который определяет, был ли файл изменен или отправляет 304, если это не так, в сочетании с правильными заголовками, решил эту проблему.

Артур

Ответы [ 2 ]

7 голосов
/ 22 июля 2009

Попробуйте добавить это к набору заголовков: -

$offset = 60 * 60 * 24;
header('Content-type: text/css');
header('Cache-Control: max-age=' . $offset);
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT');
header('Last-Modified: ' . gmdate ("D, d M Y H:i:s", time()) . ' GMT');

Проблема была в инструкции must-revalidate в заголовке элемента управления кэшем. Это может привести к тому, что клиент будет повторно запрашивать CSS каждый раз, когда это необходимо, и ваш код не будет обрабатывать заголовок If-Modified-Since и отправку кода состояния ответа неизмененного 304.

Приведенный выше подход сокращает период кэширования до 1 дня и исключает обязательную повторную проверку инструкции. Он также добавляет заголовок Last-Modified (кеш может решить не кэшировать элемент, если отсутствует заголовок Last-Modified или ETag).

Чтобы улучшить это, вы можете найти фактическое время последнего изменения css-файла, который вы сжимаете, и отправить его как заголовок Last-Modified. Вы можете включить в свой код сравнение заголовка If-Modified-Since запросов со значением времени последнего изменения css-файлов. Если вы находите их такими же, отправьте этот набор заголовков, но также отправьте статус 304 Unmodfied и не отправляйте тело вообще. (Я на самом деле не человек PHP, поэтому я оставлю это экспертам PHP, чтобы добавить их в другой ответ).

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

0 голосов
/ 22 июля 2009

Если вы читаете python / django, вы можете прочитать код для django compressor . Он помещает несколько файлов CSS в один. Часть CSS выглядит так, как будто она запускает CSSTidy для очистки CSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...