ruby-on-rails - 使用 Rails 以编程方式生成缓存

标签 ruby-on-rails ruby http caching auto-generate

我有一个巨大的页面,我正在使用 rails caches_page 命令进行缓存。 在生成缓存之前,第一个 http 请求大约需要 30 秒才能生成缓存。我想避免这种情况,以便第一个访问该页面的用户可以更快地加载它。

我正在尝试使用 http 以编程方式生成缓存,但这似乎不起作用:

uri = URI.parse("http://mydomain.com/huge_page")

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)

response = http.request(request)

我得到的响应是超时错误:

Timeout::Error (execution expired)

您对我如何做到这一点有什么建议吗?

最佳答案

如果您尝试通过 HTTP 请求生成缓存,则必须确保您没有在原始请求的上下文中发出该请求。这意味着页面将请求自己。

如果您这样做并且只有一个线程或服务器在运行您的应用程序,它将永远无法完成请求并超时。这是因为在完成 response = http.request(request) 部分之前,操作不会完成。但是,您的服务器将无法响应,因为它正在执行操作。

但是,所有这些都是说您真的应该永远不要在任何情况下都有一个需要那么长时间才能加载的请求。任何需要超过 1 秒(或者在生产中,比如 200 毫秒)的东西都应该移到 Delayed::Job worker 或类似的后台队列中。

在不知道您的应用的详细信息的情况下,我强烈建议您想出一种可以更快地生成页面的方法,而不是依赖于此处的缓存。

关于ruby-on-rails - 使用 Rails 以编程方式生成缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16164492/

相关文章:

arrays - 访问对象数组中的实例变量值 : Ruby

ruby-on-rails - Windows 上的 Capistrano : 'cap deploy' defaults to wrong username

Ruby:@cars.each 之间的区别做 |car|对于@cars 中的汽车

ruby-on-rails - Ruby (/rails?) 顶级命名空间

ruby-on-rails - 以编程方式定义 around_ 回调时为 "no block given"

X-Frame-Options 和 Content-Security-Policy header 之间的安全区别?

ruby-on-rails - 使用 Graph API 和 ruby​​ 发布到 facebook

http - RESTful Web 服务能否从 SPDY 协议(protocol)中获益?

ruby-on-rails - RoR安装: Run 'bundle install' not working?

ruby-on-rails - 通过自继承STI模型获得关联