2013-04-23 50 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