2013-04-23 80 views
1

我有一个巨大的页面,我正在使用rails caches_page命令进行缓存。 在生成缓存之前,第一个http请求需要大约30秒来生成缓存。我想避免这种情况,所以第一个用户点击该页面可以更快地加载它。使用Rails以编程方式生成缓存

我试图以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) 

你有什么建议我怎么能做到这一点?

回答

1

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

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

但是,所有这一切都是说,你应该真的从来没有在任何情况下有一个需要这么长的加载的请求。任何需要超过一秒(或者在生产中,如200毫秒)的应该移动到Delayed :: Job worker或类似的后台队列中。

如果不知道应用程序的详细信息,我强烈建议您想出一种方法来更快速地生成页面,而不是依赖此处的缓存。

+0

该页面的缓存版本非常快(在200毫秒以下),它在第一次执行时的请求在计算上很复杂。我不认为这次Delayed :: Job可以帮助我。 – 2013-04-23 08:55:18

+0

关于拥有一个线程/流程的原始情况如何,您可以同时提供多个请求吗? – Kris 2013-04-23 10:13:28

+0

是的,我设置了4名工人,因此应该可以一次提供多个请求。 – 2013-04-23 14:10:34