2012-03-02 5 views
4

古いRailsプロジェクトのページキャッシュは、オンラインでdocを読むことから期待通りに動作しますが、Rails 3.1/3.2では同じように動作しません。 Railsはページをディスクに書き込むが、決してそれらを使用しないように見える(したがって、私はそれがメモリ内のページをキャッシュしていると仮定する)。私は、次のを持って新しいのRails 3.2.2アプリでRails 3.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がディスクに表示されます。私はCtrl + Rキーまたはシフト+ CTRL + rが、私が見た場合、私は、Firefoxを使用してい

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を入力した場合、私は以下を参照してください。私は+ RまたはCtrl + Shift + RをCTRL場合

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

は今、私は以下を参照してください。

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"と設定した場合の動作は同じです。

Getting Started Rails Guideでは、「Railsは、コントローラから生成する動的コンテンツよりもパブリックディレクトリに静的ファイルを配信します」と述べていますが、これは当てはまりません。

ページがメモリにのみキャッシュされ、ディスク上のファイルが使用されていないようです... ここで何が起こっているのか、どのようにディスク上のページをキャッシュできるのか誰でも説明できますか?メモリ内のすべてのページをキャッシュするのは現実的ではありません。ありがとう!

  • Rack::Cache
  • ページのキャッシュ

ページキャッシュがcaches_pageがオン、および/公共の場でのファイルの書き込みを行うものです:

+0

私はRails.cache.clearを実行すると、Railsは実際にメモリキャッシュとディスク上のファイルを無効にすることができます(メモリにディスクがない場合にのみ使用します) ? – Sheldno

答えて

2

が起こっているのキャッシングの2つの形式があります。ページのキャッシュは、そのファイルがそこにあると、何かが削除されるまで提供され続けます。それは非常に高速です:あなたは通常、nginx、apacheなどを設定して、ルビを要求することなく直接それらのファイルを提供します。nginxやapacheを実行していない場合は、運用時にデフォルトでオフになっているレールが静的アセットを提供するように設定されている場合にのみ、そのファイルが提供されます(config.serve_static_assets参照)

Rack::Cacheはhttp対応キャッシュです。あなたとあなたとの間に存在する可能性のある中間キャッシュを通知します。Rails.cache(見た目ではファイルストア)に設定したストアにキャッシュされたデータを保存します。 Rack :: Cacheは、キャッシュされたデータを返すかどうか、または要求をアプリケーションに引き継ぐかどうかを決めるために、ルビを経由しなければならない。

+0

これは感謝します、ありがとう!再:オリジナルの質問は、静的なページを提供するために私は基本的にファイルの存在をチェックし、それを提供している場合は、Apacheのフィルタを設定する必要がありますか?これは、max-age、etags、およびlast_modifiedがここでは適用されないことを意味します(キャッシュを無効にする唯一の方法はファイルを削除することです)。 – Sheldno

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を返す)空白のページを受信し始めました。私はこれを回避する方法を見つけることができませんでした...私は、Rails.cacheでmemcachedを使用するオプションを残したまま、ファイルストアを使用するようにRack :: Cacheを設定する方法を知らない。

私は現在、ほとんどのサイトでRailsページのキャッシュを使用しています。残念ながら、これには複雑なスイープを維持するという欠点があります。また、クエリパラメータを必要とするページは、expires_inとfresh_when/staleを使ってメモリにキャッシュする必要があります。

関連する問題