2009-12-01 74 views
4

我正在使用rmagick gem從控制器生成動態圖像。控制器將id作爲參數,在模型上查找,在現有圖像上寫入文本並輸出。在Rails中緩存動態圖像

我已經運行一些基準比較,產生它的每個請求對寫入磁盤,並使用send_data輸出,如果它已經存在。我沒有注意到這兩種方法之間的請求/秒差別很大。

是否有緩存圖像或將其寫入磁盤,而不是動態生成它爲每個請求的最佳做法?一旦生成,這些圖像將保持大部分爲靜態,但我也希望在一定的時間間隔後重新生成它。

回答

5

最佳做法是緩存生成的圖像並允許網絡服務器爲它們提供服務。

使用的網絡服務器如Apache或Nginx的在你的Rails應用程序的前面,並確保你寫的圖像到web服務器可以成爲它的位置。因此,如果您的Rails路線計算結果爲/dynamic_images/3.png(其調用dynamic_images_controller動作show,id = 3且format = png),請將該圖像寫入public/dynamic_images/3.png,並在控制器中使用send_file發送該圖像。

下一次請求該文件(/dynamic_images/3.png)時,Web服務器將很樂意爲其提供服務(緩存),Rails應用程序將永遠不會受到影響。

對於高級需求,如重新生成的圖像,並清理你的控制器代碼,看看在paperclip寶石。

+0

在此設置的量產版將意味着你有Apache或Nginx的運行*在彪馬的前面或任何每隔*應用程序服務器正在運行的Rails ? – nrser 2017-07-04 11:32:59

1

你應該把緩存圖片到這樣的目錄從那裏他們將通過網絡服務器來提供服務。你不想爲此使用send_data - 這太慢了。 另外,您可能會希望忽略VCS中的該目錄。

2

只是一個想法(沒試過):爲什麼不圖像(尤其是那些動態生成的)與memache存儲?

Rails.cache.write(「MY_IMAGE」,圖像)

+0

我其實很喜歡這個選項。請參閱[RailsCasts#115](http://railscasts.com/episodes/115-caching-in-rails-2-1) – 2011-10-05 15:32:40

+0

默認情況下,Memcache的最大密鑰大小爲1MB,從我記憶中來看,它不盡量緩存大對象(桶大小/調整大小,儘管現在可能已經修復)。這對圖像來說可能是一個糟糕的選擇。此外,這意味着在許多生產部署中遠程命中(至少潛在地),這...可以折衷:減少生成工作量,但花費更多的檢索和負擔與本質上沒有設計的文件服務相關的服務因爲它並不需要這樣做。如果你想在內存中使用它,你可能需要Rails進程本地的。 – nrser 2017-07-04 11:40:36