2011-10-21 6 views
0

Railsページキャッシュを再生成する簡単な方法はありますか?キャッシュを破棄するのは簡単です。Railsキャッシュの再生成

Person.each.all do |person| 
    expire_page(:controller => 'yql', :action => 'feed', :id => person.id) 
end 

これは、パブリックディレクトリ内のキャッシュされたファイルを削除します。私はそれらを破壊した直後に、私はそれらを再現したい。私は彼らが公開ウェブサイトで見られるまで待つことを望んでいません。

これは単純なのレールの方法ですか?

感謝

答えて

0

もっと良い解決策は、ページを期限切れにしてから、カールを使って打つことです。 curlは新しい要求を生成するため、乗客は1つのフィードをレンダリングするのに十分なメモリしか必要としません。また、キャッシングシステムのラウンドを回避します。

def recache 
    Person.find_each :batch_size => 100 do |person| 
    expire_page(:controller => 'yql', :action => 'feed', :id => person.id) 
    system("curl #{yql_feed_url person.id}") 
    end 
    render :text => "re-caching was successful" 
end 

もちろん、これはLinux専用のソリューションです。競合状態に気をつけるのも面倒です。

0

は、あなたがそれをレンダリングする必要があり、そしてあなたはそれを要求する必要があり、それをレンダリングするために、それをキャッシュします。私はあなたが要求なしでこれを行うことができるとは思わない。あなたはいつでもRailsから作ることができますが、それは面倒です。あるいは、curlやRuby curbのようなライブラリを使って外部処理を行うこともできます。

本当にこれを行う必要がありますか?

+0

フィードのレンダリングは高価です。それは本当に夜中に行われる必要があります。 – superluminary

+0

いくつかの 'cron'と' curl'のような音が仕事をすることができます。 – tadman

+0

問題は、フィードが非常に制限された外部APIによってフィードが非常に高速に(生成されるよりもはるかに速く)ヒットすることです。私は準備ができているフィードを必要とする、またはそれは私のアプリケーションをオーバーロードし、私のデータベースは、あまりにも落ちる。実際には、私は解決策があるかもしれないと思う... – superluminary

1

ので、記録のために、ここで私がやったことだ:

def recache 
    Person.all.each do |person| 
    path = MyApp::Application.config.action_controller.page_cache_directory + yql_feed_path(person) 
    FileUtils.mkdir_p(File.dirname(path)) 
    File.open(path, 'w') do |f| 
     f.write(render_to_string :action => 'feed') 
    end 
    end 
    render :text => "re-caching was successful" 
end 

フィードは、単に適切な場所にファイルにレンダリングして書かれています。私はキャッシングシステムを回すことについて全く幸せではないが、今は十分である。

関連する問題