3

我有一个caches_page用于某些控制器/动作的应用程序。为了使缓存过期,我使用清扫器。总而言之,这是一个标准解决方案。

但是,由于某些更改可能会导致服务器上出现一些请求(因为推送通知已发送出去并可能触发客户端设备获取新数据),所以我希望能够预渲染缓存,所以它在请求到来之前就准备好了。当然,我可以等待第一个请求自动写入缓存,但是在这种情况下,我知道请求会来,可能会有很多,而且它们可能就在附近-同时。所以我想准备好缓存。

为了增加一些复杂性,更新是通过一个普通的网页完成的,并在一个标准的、主要是脚手架的控制器中处理,而我想要缓存的“页面”是一个完全不同的控制器的 JSON 响应,它作为一个 API。

那么,我如何从清扫器(或从处理缓存过期更新的控制器)触发新的页面缓存以立即写入?

另一种说法可能是:如何从一个控制器向另一个控制器发出内部请求?


编辑:最终做了你在下面看到的事情。它不是非常优雅,但它很有效

class ModelSweeper < ActionController::Caching::Sweeper
  observe Model

  def after_create(model)
    expire_pages_for(model)
  end

  def after_update(model)
    expire_pages_for(model)
  end

  def after_destroy(model)
    expire_pages_for(model)
  end

  protected

    def expire_pages_for(model)
      # expire index page
      expire_and_bake(models_url)

      # expire show page
      expire_and_bake(model_url(model))
    end

    def expire_and_bake(url)
      # extract the path from the URL
      path = url.sub(%r{\Ahttp://[^/]+}, "")

      # expire the cache
      expire_page(path)

      # request the url (writes a new cache)
      system "curl '#{url}' &> /dev/null &"
    end

end
4

1 回答 1

2

预热服务器的缓存可能超出了应用程序逻辑的范围。在使用包含 curl 命令并遍历网站所有区域的 rake 任务之前,我已经实现了一个缓存预热系统。

# lib/tasks/curl.rake
desc "curl"
task :curl do
  paths.each do |path|  
  `curl #{path}`
  end
end

您可以通过在 Rails 项目根目录中发出“rake curl”来调用此任务。

或者,您可以在缓存过期后从您的清扫器方法内部调用此 rake 任务(包装 curl)。查看 Railscast Ryan Bates 在从 Rails 应用程序代码内部调用 rake 任务时所做的:http ://railscasts.com/episodes/127-rake-in-background

更多关于 curl 的信息:http: //curl.haxx.se/docs/manpage.html

于 2012-02-24T02:09:30.920 回答