Отсутствие кэша в 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')

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

  1. Кажется, пропустил кеш, но...
  2. После этого запросы, похоже, не загружают контроллер, не запускают какие-либо запросы и т. Д., Что наводит меня на мысль, что он загружен из кэша.

Вот что выводит журнал при первом запросе, а затем пять раз перезагружает:

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 и т. Д. (Но, с другой стороны, очень быстро).

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

Другие вопросы по тегам