Удаление кеша в Rails - PullRequest
       31

Удаление кеша в Rails

9 голосов
/ 08 октября 2008

Когда я развертываю приложение rails в производственном режиме, оно добавляет строку даты и времени в качестве параметра запроса в конец всех URL статических активов. Это сделано для того, чтобы браузеры не использовали устаревшие кэшированные копии ресурсов после повторного развертывания приложения.

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

Ответы [ 3 ]

13 голосов
/ 10 октября 2008

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

Вы можете отключить это в Capistrano со следующей настройкой

set :normalize_asset_timestamps, false

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

Если вы используете Apache, вы можете добавить что-то вроде этого, чтобы реально заставить кеширование работать на вас. Это помогает сообщению браузеру полагаться на директивы «Cache Control», означающие, что если он знает, что ресурс кэшируется, он даже не потрудится запросить его.

#Etags should be based on the file parameters only (default includes INode)
FileETag MTime Size  

#Rewrite stuff
RewriteEngine On  

#This sets the environment variable (is_versioned) when the URL query string
#looks like ?874353948543  or any string of digits
RewriteCond %{QUERY_STRING} ^[0-9]+$
RewriteRule ^(.*)$ $1 [env=is_versioned:true]  

<Directory /deployed-rails-app/public/ >
    Options -Indexes FollowSymLinks -MultiViews
    AllowOverride None
    Order allow,deny
    allow from all  

    #For files, force the browser to rely on cache-control directives and 
    #Rails asset timestamps by removing Etags and Last-Modified dates  

    #For all assets that aren't stamped by rails, cache them for ~ 3 hours
    Header set "Cache-Control" "max-age=10000"
    Header unset Etag
    Header unset "Last-Modified"  

    #For all assets that ARE stamped by rails, cache them for 30 days
    Header set "Cache-Control" "max-age=2592000" env=is_versioned

</Directory>

Я настроил свой рабочий сервер таким образом, и теперь возвращающиеся посетители выполняют только один запрос (Get /), который возвращает динамическое содержимое, и все ресурсы (~ 40-50) кэшируются.

6 голосов
/ 09 октября 2008

Я думаю, что вы можете использовать ENV ['RAILS_ASSET_ID'] для изменения идентификатора уничтожения кэша. К сожалению, это для всех активов.

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

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

Наконец, вы всегда можете переопределить rails_asset_id с помощью собственного метода .

Надеюсь, это поможет.

0 голосов
/ 09 октября 2008

@ Aupajo Мне это нравится, но я думаю, что могу пойти немного дальше. Проблема в том, что Capistrano создает новые копии всех файлов при каждом развертывании, поэтому все строки очистки кэша изменяются. Однако MD5 файла будет меняться только при изменении содержимого файла.

Конечно, генерация MD5 является дорогой и медленной, но вы можете кэшировать MD5 файла в memcache, (вводится время изменения, как если бы время изменилось, MD5 может изменить , но если метка времени не изменилась, MD5 не изменится

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