2012-03-02 21 views
4

在一箇舊的Rails項目頁面緩存工作正如我在網上閱讀doc所期望的那樣,在Rails 3.1/3.2中,它的工作方式並不一樣。看起來Rails將頁面寫入磁盤,但從不使用它們(所以我認爲它將內存中的頁面緩存)。Rails 3.2何時使用它緩存到磁盤的頁面?

(請忍受我長的解釋,這並不複雜只是徹底...)

在一個新的Rails 3.2.2應用程序,我有以下幾點:

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

當我開始我的服務器在生產和訪問本地主機我看到:

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 

如果我編輯公共/ 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) 

而我的公共變化/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指出:「Rails將在公共目錄中提供任何靜態文件,優先於我們從控制器生成的任何動態內容」,但顯然情況並非如此。

它似乎只將頁面緩存在內存中,並且磁盤上的文件沒有被使用...... 任何人都可以解釋這裏發生了什麼,以及我如何緩存磁盤頁面?緩存內存中的所有頁面並不實際。謝謝!

+0

Rails是否有可能將文件緩存在內存中的磁盤上(只有當它們不在內存中時才使用它們),然後當我執行Rails.cache.clear時,Rails實際上使內存緩存和磁盤上的文件無效? – Sheldno 2012-03-02 20:55:07

回答

2

有兩種形式的緩存的事情:

  • Rack::Cache
  • 頁面緩存

頁面緩存是caches_page打開什麼,以及/公共寫入文件。頁面緩存是愚蠢的,因爲一旦該文件在那裏,它將繼續得到服務,直到刪除它。好處是速度非常快:您通常會配置nginx,apache等來直接處理這些文件,而無需請求任何紅寶石。如果你沒有運行Nginx的或Apache那麼如果導軌被配置爲靜態資產文件將只獲得服務,這是默認關閉的生產(見config.serve_static_assets

Rack::Cache是HTTP識別緩存,因此它可以處理到期時間,告訴你和用戶之間可能存在的中間緩存,他們可以緩存什麼等。它將緩存的數據存儲在你配置的任何存儲Rails.cache(文件存儲的外觀)。任何請求仍然需要通過ruby進行,以便Rack :: Cache可以決定是否返回緩存的數據,還是讓請求繼續到您的應用程序。

+0

這很有道理,謝謝!回覆:原來的問題,爲靜態頁面,然後我本質上必須設置一個Apache的過濾器,檢查文​​件的存在,如果它存在服務它?我想這意味着max-age,etags和last_modified在這裏不適用(使緩存無效的唯一方法是刪除文件)? – Sheldno 2012-03-03 19:25:38

0

這是我嘗試安裝,我認爲會做我想要的一切:

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來使用文件存儲,同時仍然可以使用Rails.cache使用memcached。

我現在使用Rails頁面緩存大部分的網站。不幸的是,這有一個缺點,就是維護複雜的清理器,這也意味着需要查詢參數的頁面必須在expires_in和fresh_when/stale中緩存在內存中。