как мне управлять кэшированием для релизов с PHP, заголовками и т.д. для магистрального проекта?


Итак, мы делаем еженедельные выпуски нашего проекта, и у нас возникают проблемы с клиентами, имеющими старые устаревшие версии определенных файлов.

Стек является магистральным с requirejs с шаблоном магистрали и сервером Apache2 с бэкэндом PHP.

У нас есть html-файл индекса, который загружается, HTML-файлы шаблонов, которые загружаются с помощью AJAX, а затем все файлы js.

Этот вопрос, по-видимому, связан с https://stackoverflow.com/questions/12103341/backbone-boilerplate-disable-caching но я не увидел там хорошего ответа.

Я слышал, что заголовки управления кэшем и мод истекают, и заголовки модов для PHP могут быть полезны, но я не знаю, как собрать все это вместе.

По сути, то, что мы хотим сделать, - это убедиться, что при выпуске нового кода на сервере prod все не будет кэшировано хотя бы один раз. Затем после этого обычное кэширование для увеличения скорости загрузки будет идеально.

По крайней мере, я бы хотел понять, как полностью предотвратить кэширование этих вещей.

Есть идеи?

Author: Community, 2012-10-19

5 answers

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

Однако вам следует использовать r.js для создания рабочей версии ваших сценариев (он компилирует и сокращает все файлы, загруженные с require, и создает единую библиотеку). Это сократит время загрузки и избавит вас от многих забот. Вы бы связали только эту библиотеку и указали версию сборки в самом имени файла (что-то вроде backbone.app.1.0.23456.js).

 5
Author: nxtwrld, 2012-10-26 14:54:45

Мне было трудно управлять браузером пользовательского клиента в том, что касается кэширования. Один трюк, который я использовал в прошлом, - это добавление случайного числа к URL-адресу моего файла JS. Как

<script src="https://www.mydomain.com/myjsfile.js?123456789"></script>

ИЛИ

<script src="https://www.mydomain.com/myjsfile.js?releaseID=123456789"></script>

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

Я надеюсь, что это поможет. Удачи.

 6
Author: Bryan Allo, 2012-10-19 19:48:54

Кэширование файлов на стороне клиента определяется двумя значениями: метаинформацией в <head>-разделе вызываемого html-файла и HTTP-заголовком.

В HTML-файле вы можете указать два мета-тега cache-control и expires для определения недельной даты истечения срока действия, указав простую php-команду:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="PRIVATE">
<?php
    $daysDelta = 7-date("w");
    $expiration = date(DATE_RFC1123, mktime(0, 0, 0, date("m"), 
        date("d")+$daysDelta+1, date("Y")));
?>
<META HTTP-EQUIV="EXPIRES" CONTENT="<?= $expiration ?>">

Это убьет кэш в понедельник утром. Другим методом может быть настройка кэша с помощью HTTP-заголовка :

<?php
    header("Cache-Control: private");
    header("Expires: <?= $expiration ?>");
?>

Используя оба метода, вы будете есть кэширование в течение недели, но после выходных клиенты аннулируют свои кэши и удаляют данные.

 5
Author: Lars, 2012-11-01 10:38:51

Чтобы удалить кэширование со страницы, вам необходимо включить это в верхней части страницы: -

$this->output->set_header("Expires: Tue, 01 Jan 2000 00:00:00 GMT"); 
$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false); 
$this->output->set_header("Pragma: no-cache");
 5
Author: Sachin Prasad, 2013-05-04 09:54:10

Добавление случайного числа в uri нарушает кэширование клиента.
Вместо этого добавьте время последнего изменения файла.

<script src="myjsfile.<?=filemtime('myjsfile.js')?>.js"></script>

Обработка, для которой потребуется правило .htaccess, такое как

RewriteRule ([^/]*)\.[0-9]*\.css$ $1.css [L,NC]

И, кроме того, предоставьте .htaccess долгосрочные инструкции по кэшированию

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"
</IfModule>
 0
Author: Alex, 2012-10-30 11:45:31