Когда Rails 3.2 использует страницы, которые он кэширует на диск? - PullRequest
4 голосов
/ 02 марта 2012

В старом проекте Rails кэширование страниц работает так, как я ожидаю от чтения документации в Интернете, в Rails 3.1 / 3.2 оно работает не так. Похоже, что Rails записывает страницы на диск, но никогда не использует их (и поэтому я предполагаю, что это кэширование страниц в памяти).

(Пожалуйста, мирись с моим длинным объяснением, это не сложно, просто тщательно ...)

В новом приложении Rails 3.2.2 у меня есть следующее:

class HomeController < ApplicationController
  caches_page :index
  def index
    expires_in 1.year, :private => false, :public => true
  end
end

Когда я запускаю свой сервер в производство и захожу на localhost, я вижу:

cache: [GET /] miss, store


Started GET "/" for 127.0.0.1 at 2012-03-02 12:19:22 -0500
Processing by HomeController#index as HTML
  Rendered home/index.html.erb within layouts/application (20.0ms)
Write page /home/sheldon/Dev/rails-3.2-app/public/index.html (0.4ms)
Completed 200 OK in 30ms (Views: 28.7ms | ActiveRecord: 0.0ms)

Файл public / index.html появляется на диске.

Я использую Firefox, если я нажимаю Ctrl + R или Shift + CTRL + R, я вижу:

cache: [GET /] fresh
[2012-03-02 12:21:39] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

Если я отредактирую файл public / index.html напрямую и нажму ctrl + r или ctrl + shift + r, я не вижу изменений, которые я внес в файл.

Если я открою консоль рельсов и наберу Rails.cache.clear я увижу:

=> ["/home/sheldon/Dev/rails-3.2-app/tmp/cache/9F4", "/home/sheldon/Dev/rails-3.2-app/tmp/cache/A9A"]

Теперь, если я нажму Ctrl + R или Ctrl + Shift + R, я вижу:

cache: [GET /] miss, store


Started GET "/" for 127.0.0.1 at 2012-03-02 12:37:04 -0500
Processing by HomeController#index as HTML
  Rendered home/index.html.erb within layouts/application (0.0ms)
Write page /home/sheldon/Dev/rails-3.2-app/public/index.html (0.3ms)
Completed 200 OK in 2ms (Views: 1.2ms | ActiveRecord: 0.0ms)

А мои изменения в public / index.html перезаписываются.

Похоже, что public / index.html никогда не используется.

Если я отредактирую html-файл, найденный в tmp / cache (в выводе консоли выше), а затем ctrl + r или ctrl + shift + r, я все равно не увижу изменения, внесенные мной непосредственно в файл tmp / cache. 1029 *

Если я установлю config.cache_store = :file_store, Rails.public_path + "/cache", поведение будет идентичным.

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

Кажется, что страница кэшируется только в памяти, а файлы на диске не используются ... Может кто-нибудь объяснить, что здесь происходит и как я могу кэшировать страницы на диске? Это не практично кэшировать все страницы в памяти. Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Существует две формы кэширования:

  • Rack::Cache
  • Кэширование страниц

Кэширование страниц - это то, что caches_page включает и записывает файлы в / public. Кэширование страниц тупо в том смысле, что как только этот файл появится, он будет обслуживаться до тех пор, пока что-то не удалит его. Плюс в том, что он очень быстрый: вы обычно настраиваете nginx, apache и т. Д. Для непосредственного обслуживания этих файлов без запроса ruby. Если вы не используете nginx или apache, то этот файл будет обслуживаться только в том случае, если rails настроен для обслуживания статических ресурсов, что по умолчанию отключено в рабочей среде (см. config.serve_static_assets)

Rack::Cache - это кэш с поддержкой http, поэтому он может обрабатывать время истечения, сообщает промежуточным кешам, которые могут существовать между вами и пользователем, что они могут кешировать и т. Д. Он хранит свои кэшированные данные в любом настроенном вами хранилище Rails.cache быть (хранилище файлов по внешнему виду). Любой запрос по-прежнему должен проходить через ruby, чтобы Rack :: Cache мог решить, следует ли возвращать кэшированные данные или разрешить выполнение запроса до вашего приложения.

0 голосов
/ 07 марта 2012

Это была моя попытка установки, которая, я думал, будет делать все, что я хотел:

config.cache_store = :dalli_store, '127.0.0.1:11211'

config.middleware.delete Rack::Cache
config.middleware.use Rack::Cache,
  :verbose => true,
  :metastore => "memcached://127.0.0.1:11211/meta",
  :entitystore => "file:#{Rails.root}/tmp/cache/rack/body"

config.action_controller.page_cache_directory = "#{Rails.root}/public/cache"

Сначала казалось, что это работает, но я начал получать пустые страницы, когда страница была устаревшей, но действительной (то есть возвращала 304). Я не мог найти способ обойти это, так что ... я не знаю, как настроить Rack :: Cache для использования хранилища файлов, при этом оставляя возможность использовать memcached с Rails.cache.

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

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