0

同じRailsアプリを使用していますが、ドメイン名が多く、UIがわずかに異なります。ドメインごとに異なるロケール(en、es、frなど)が存在する場合があります。

コントローラcaches_pageのすべてのオブジェクトをキャッシュするために使用します。サブドメインの代わりにドメインとロケールで動作するように少し変更を加えて、このソリューションusersを試しました。

  def self.page_cache_path(path,extension)  
    MyApp::Application.config.action_controller.page_cache_directory + '/cache' + @root_site.to_s + "/" + path + extension
  end

  def cache_page(content = nil, options = nil, gzip = Zlib::BEST_COMPRESSION)
    path = [@root_site, I18n.locale].join("/") # nil would add slash to 2 ends
    path << case options
    when Hash
      url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format]))
    when String
      options
    else
      if request.path.empty? || request.path == '/'
        '/index'
      else
        request.path
      end
    end
    super(content, path, gzip)
  end

このコードは、ドメイン名を最初のフォルダーとして配置して、キャッシュファイルを正常に書き込んでいるようです。

Write page /Users/user/Sites/myapp/public/cache/domain1.com/en/users/john.html (1.7ms)
Completed 200 OK 

私が見る問題は、キャッシュされたページにアクセスしたときにキャッシュを取得していないことです。

Started GET "/users/john" for 127.0.0.1 at 2013-01-16 19:04:18 -0200
Processing by UsersController#show as HTML
...
Write page /Users/user/Sites/myapp/public/cache/domain1.com/en/users/john.html (1.7ms)
Completed 200 OK 

私のusersコントロールでは、私は単にこれを持っています

caches_page :show

キャッシュファイルからの読み取りを妨げているものとその解決方法を知っている人はいますか?

4

1 に答える 1

2

Railsでホスト名ごとにキャッシュし、ホスト名ごとに正しいキャッシュを提供する場合は、caches_action :show代わりにを使用する必要があります。キャッシュはRails.cacheに保存され、Rails独自のメカニズムによって提供されます。

アクションキャッシングは、内部でフラグメントキャッシングを使用し、アラウンドフィルターを使用してジョブを実行します。フラグメントキャッシュは、リクエストのホストとパスに従って名前が付けられます。http://david.example.com/lists/show/1でアクセスされるページは、david.example.com / lists / show/1という名前のフラグメントになります。 http://api.rubyonrails.org/classes/ActionController/Caching/Actions.html

ただし、ページのキャッシュを維持し、キャッシュされたコンテンツを提供するときにRailsを完全に回避する場合は、ホスト名を組み合わせて、カスタマイズされたパスで静的ファイルを検索するようにWebサーバーを構成する必要があります。

たとえば、 nginxconfのpage_cache_fuの例を引用します

if (-f $document_root/cache/$host/$uri/index.html) {
  rewrite (.*) /cache/$host/$1/index.html break;
}

if (-f $document_root/cache/$host/$uri.html) {
  rewrite (.*) /cache/$host/$1.html break;
}

私は上記のconfをテストしていませんが、それがアイデアです。ほとんどのWebサーバーで同じことが達成できるはずです

于 2013-01-17T04:49:26.533 に答える