ruby-on-rails – Rails 3.2什么时候使用它缓存到磁盘的页面?

在一个旧的Rails项目页面缓存工作正如我期望的在线阅读doc,在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或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控制台并输入Rails.cache.clear,我看到:

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

现在,如果我按住Ctrl或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.

如果我编辑在tmp / cache中找到的html文件(在上面的控制台输出中)然后按ctrl r或ctrl shift r我仍然看不到我直接对tmp / cache文件所做的更改.

如果我设置config.cache_store =:file_store,Rails.public_path“/ cache”行为似乎相同.

在“入门指南”指南中,它说“Rails将在公共目录中提供任何静态文件,而不是我们从控制器生成的任何动态内容”,但显然情况并非如此.

看起来页面只缓存在内存中,并且磁盘上的文件没有被使用…任何人都可以解释这里发生了什么以及如何在磁盘上缓存页面?将所有页面缓存在内存中是不切实际的.谢谢!

最佳答案 有两种形式的缓存:

> Rack :: Cache
>页面缓存

页面缓存是caches_page打开的,并在/ public中写入文件.页面缓存是愚蠢的,因为一旦该文件存在,它将继续获得服务,直到某些东西将其删除.好处是它非常快:你通常配置nginx,apache等直接提供这些文件,而不会遇到ruby请求.如果您没有运行nginx或apache,那么只有在将rails配置为提供静态资产时才会提供该文件,默认情况下,这些资产在生产中处于关闭状态(请参阅config.serve_static_assets)

Rack :: Cache是​​一个http感知缓存,因此它可以处理到期时间,告诉您和用户之间可能存在的中间缓存,它们可以缓存等等.它将缓存的数据存储在您配置Rails.cache的任何商店中是(文件存储的外观).任何请求仍然必须通过ruby,因此Rack :: Cache可以决定是否返回缓存数据或是否让请求继续到您的应用程序.

点赞