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


У меня есть несколько руководств о том, как сжать 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

Есть ли что-то, чего мне не хватает, или есть лучший способ сделать это?

Спасибо,

ИЗМЕНИТЬ:

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

Артур

Author: askon, 2009-07-21

2 answers

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

$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 дня и устраняет необходимость повторной проверки инструкции. Он также добавляет последний измененный заголовок (кэш может выберите не кэшировать элемент, если отсутствует заголовок последнего изменения или ETag).

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

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

 7
Author: AnthonyWJones, 2009-07-21 20:29:13

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

 -1
Author: hughdbrown, 2009-07-21 20:08:23