2011-10-21 51 views
0

有沒有簡單的方法來重新生成Rails頁面緩存?銷燬緩存很容易:重新生成Rails緩存

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

這將刪除公用目錄中的緩存文件。在我摧毀它們之後,我想重新創建它們。我不想等到他們在公共網站上查看。

有沒有簡單的rails這樣做的方法。

非常感謝

回答

0

更好的解決方案是過期頁面,然後使用curl命中。因爲curl會生成一個新的請求,所以Passenger只需要足夠的內存來渲染一個feed。它也避免了繞過緩存系統。

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

呈現Feed是昂貴的。這真的需要在半夜完成。 – 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 

飼料簡直是在正確的位置繪製並寫入文件。我並不樂意繞過緩存系統,但現在就足夠了。