2009-12-01 60 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