Отсутствие кэша в Rails 3.2 и кэширование страниц в разработке - кто-нибудь еще? - PullRequest
2 голосов
/ 13 февраля 2012

Используя 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

разработка.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 Ответ

4 голосов
/ 13 февраля 2012

Существует несколько способов кэширования (и да, существует некоторая избыточность).

Начиная с (я думаю) rails 3.1, Rack::Cache настроен для вас. Это кеш уровня http, который понимает все время истечения срока действия, etags и т. Д. И может хранить данные в различных хранилищах кеша. Это то, что сообщает об отсутствии кэша, возможно потому, что вы не генерируете заголовки элемента управления кэшем, которые позволили бы ему кэшировать страницу (см. Помощники expires_in или fresh_when).

Кэширование страниц того типа, который вы настроили, намного старше и работает совершенно иначе. Он выгружает визуализированный HTML-код в каталог по вашему выбору, а rails затем использует их в качестве статических ресурсов (в процессе работы вы можете настроить его так, чтобы он обслуживался прямо с веб-сервера, не затрагивая код уровня ruby). Это кэширование менее разумно и ничего не знает о заголовках управления кэшем http и т. Д. (Но, с другой стороны, очень быстро).

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

...