4

Rails 3.1 / 3.2 では、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 コンソールを開いて入力すると、次のよう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 は使用されていないようです。

tmp/cache (上記のコンソール出力) で見つかった html ファイルを編集してから ctrl+r または ctrl+shift+r を編集しても、tmp/cache ファイルに直接行った変更は表示されません。

私が設定した場合config.cache_store = :file_store, Rails.public_path + "/cache"、動作は同じようです。

Getting Started Rails Guide には、「Rails は、コントローラから生成した動的コンテンツよりも優先して public ディレクトリ内の静的ファイルを配信します」と書かれていますが、明らかにそうではありません。

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

4

2 に答える 2

2

進行中のキャッシュには2つの形式があります。

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

ページキャッシュはcaches_pageオンになり、/publicにファイルを書き込みます。ページキャッシングは、そのファイルがそこにあると、何かがそれを削除するまで提供され続けるという点で馬鹿げています。利点は、非常に高速であるということです。通常、要求がrubyにヒットすることなく、これらのファイルを直接提供するようにnginx、apacheなどを構成します。nginxまたはapacheを実行していない場合、そのファイルは、railsが静的アセットを提供するように構成されている場合にのみ提供されます。これは本番環境ではデフォルトでオフになっています(を参照config.serve_static_assets) 。

Rack::Cacheはhttp対応のキャッシュであるため、有効期限を処理でき、ユーザーとユーザーの間に存在する可能性のある中間キャッシュに、キャッシュできるものなどを通知します。キャッシュされたデータは、構成Rails.cacheされたストア(外観によるファイルストア)に保存されます。それの)。リクエストは引き続きrubyを経由する必要があるため、Rack :: Cacheは、キャッシュされたデータを返すかどうか、またはリクエストをアプリケーションまで続行するかどうかを決定できます。

于 2012-03-03T00:23:48.930 に答える
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でメモリにキャッシュする必要があることも意味します。

于 2012-03-07T19:09:12.157 に答える