Nano Hash - криптовалюты, майнинг, программирование

Минимизация CSS на лету: использование кеширования браузера

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

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

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

Надеюсь, я понимаю. Проблема в том, что когда файл не изменился от последнего запроса до этого, я возвращаю 304 без изменений. Однако браузер не кэширует CSS, как должен. Есть идеи, почему бы и нет?

Вы можете посмотреть мой код здесь: https://gist.github.com/4235836 (я обычно сюда положил, но это вроде как долго)


Ответы:


1

Я думаю, вам следует проверить заголовок запроса If-modified-Since перед отправкой 304:

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && 
    strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $minifier->lastModified)
{
    header('HTTP/1.0 304 Not Modified');
    exit;
}

Также обратите внимание на выход. Если вы отправляете 304, это означает, что у клиента уже есть последняя версия, поэтому вам следует выйти из своего скрипта там.

Изменить:

При использовании заголовков с истекающим сроком действия браузер предполагает, что у него уже установлена ​​последняя версия. Таким образом, он даже не будет запрашивать сервер, в отличие от использования заголовка HTTP_IF_MODIFIED_SINCE.

Так что вы также можете добавить:

header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60 * 24)));

Затем, чтобы убедиться, что он запросит новую версию после изменения файла, вы можете сделать следующее:

<link rel="stylesheet" type="text/css" 
    href="minify.php?v=<?php echo filemtime($theFileToMinify) ?>">
07.12.2012
  • Однако у меня есть одна проблема: на живом сервере не установлены mod_headers и mod_expires. У меня тоже нет доступа для их установки, поэтому HTTP_IF_MODIFIED_SINCE не установлен. Я придумал свое решение, чтобы обойти это, но в любом случае, когда я отправляю 304, браузер по-прежнему не загружает css из своего кеша. 08.12.2012
  • Я не думаю, что вам нужны mod_headers и mod_expires, если вы устанавливаете заголовки через PHP 08.12.2012
  • Когда я выгружаю $ _SERVER HTTP_IF_MODIFIED_SINCE, там нет. Я понял, что это из-за того, что эти модули не были установлены / включены, однако я мог ошибаться. Я мог бы установить их напрямую, но по сути я сделал это, не изменяя массив $ _SERVER. 08.12.2012
  • Браузер отправит HTTP_IF_MODIFIED_SINCE, если он получил заголовок Last-Modified при последнем запросе этого файла. Обновление страницы вручную может также помешать вашему браузеру отправлять HTTP_IF_MODIFIED_SINCE. 08.12.2012
  • Ах, хорошо, я реализовал ваше решение и, похоже, оно работает, поэтому я дам вам чек. Спасибо за вашу помощь! 08.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..