Отсутствие кэша в Rails 3.2 и кэширование страниц в разработке - кто-нибудь еще?
Используя Rails 3.2 в режиме разработки, я пытаюсь протестировать простое кэширование страниц.
pages_controller.rb
class PagesController < ActionController::Base
caches_page :index, :show
def index
@pages = Page.all
end
def show
@page = Page.find(params[:id])
end
end
development.rb
config.action_controller.perform_caching = true
application.rb
config.action_controller.page_cache_directory = File.join(Rails.root, 'public')
Когда я тестирую эту настройку, кажется, что эти действия обрабатываются как обычно, и кэш страницы записывается, как и ожидалось. Однако последующие запросы сообщают о следующих двух вещах, которые меня смущают:
- Кажется, пропустил кеш, но...
- После этого запросы, похоже, не загружают контроллер, не запускают какие-либо запросы и т. Д., Что наводит меня на мысль, что он загружен из кэша.
Вот что выводит журнал при первом запросе, а затем пять раз перезагружает:
Started GET "/pages" for 127.0.0.1 at 2012-02-12 21:01:24 -1000
Processing by PagesController#index as HTML
Page Load (0.2ms) SELECT `pages`.* FROM `pages`
Rendered pages/index.html.erb (0.8ms)
Write page /Users/ckihe/Sites/experiment/public/pages.html (0.3ms)
Completed 200 OK in 3ms (Views: 1.9ms | ActiveRecord: 0.2ms)
cache: [GET /pages] miss
cache: [GET /pages] miss
cache: [GET /pages] miss
cache: [GET /pages] miss
cache: [GET /pages] miss
У кого-нибудь есть идеи, почему кеш говорит, что его нет?
1 ответ
Существует несколько способов кэширования (и да, существует некоторая избыточность).
Начиная с (я думаю) рельсов 3.1, Rack::Cache
это настройка для вас. Это кэш уровня http, который понимает все время истечения срока действия, etags и т. Д. И может хранить данные в различных хранилищах кеша. Это то, что сообщает об отсутствии кэша, возможно потому, что вы не генерируете заголовки элемента управления кэшем, которые позволили бы ему кэшировать страницу (см. expires_in
или же fresh_when
хелперы).
Кэширование страниц того типа, который вы настроили, намного старше и работает совершенно иначе. Он выгружает визуализированный HTML-код в каталог по вашему выбору, и рельсы затем подают их в качестве статических ресурсов (в процессе работы вы можете настроить его так, чтобы он обслуживался прямо с веб-сервера, не затрагивая код уровня ruby). Это кеширование менее разумно и ничего не знает о заголовках управления кэшем http и т. Д. (Но, с другой стороны, очень быстро).
Итак, в итоге, у вас есть две схемы кэширования, которые не знают друг друга, поэтому вы получаете промах от одного из них и удар от другого.