2011-10-21 55 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 

饲料简直是在正确的位置绘制并写入文件。我并不乐意绕过缓存系统,但现在就足够了。