Наконец-то нашли вопрос и ответ:
В: «Кэш прогрева» при развертывании
A: https://stackoverflow.com/a/942774/593053
Оставив здесь мой вопрос, чтобы другие могли идти по следу и учиться
от моей боли.
Также актуально: Rails 3.2: Предварительный рендеринг (запекание) кеша новой страницы сразу после истечения срока действия?
Мое полное решение состояло в том, чтобы принять соглашение, что если cache=regen
находится в запрошенном URL, это означает, что сгенерированная страница должна быть помещена в кеш.
Для контроллеров, для которых требуется кэширование, include CacheRegen
. CacheRegen
заставляет контроллер не читать из кэша, когда cache = regen, и не помещать cache = regen в ключ при хранении в кэше.
Код для которого:
module CacheRegen
def read_fragment(key, options = nil)
if /cache=regen/.match(key)
logger.info("forcing cache miss due to param cache=regen, key=#{key}")
return nil
end
super(key, options)
end
def write_fragment(key, content, options = nil)
unless key.sub!(/cache=regen/, '').nil?
key.sub!(/\?\&/, '?')
key.sub!(/\&\&/, '&')
key.sub!(/\?$/, '')
key.sub!(/\&$/, '')
logger.info("wrote page to cache with key #{key}")
end
super(key, content, options)
end
end
Наконец, я поместил следующий код в new_pages.rake:
require 'action_dispatch'
def get_url(sess, url)
uri = "http://YOURSITE.com/" + url + "cache=regen"
puts "retrieving " + uri
foo = sess.get(uri)
puts "got it. #{foo}, #{sess.response.body.length} bytes"
end
desc "If necessary, generate new versions of the most expensive pages"
task :new_pages => :environment do
puts "Updating pages..."
sess = ActionDispatch::Integration::Session.new(Rails.application)
["controller1", "controller2", "controller3"].each { |noun|
get_url(sess, noun + "?")
}
puts "done."
end
И в моем окружении у меня есть задача deploy
, которая зависит от задачи new_pages
.
Есть ли какой-нибудь драгоценный камень, который делает все это более автоматическим?