在Rails中缓存动态图像

时间:2009-12-01 13:28:12

标签: ruby-on-rails caching rmagick

我正在使用rmagick gem从控制器生成动态图像。控制器将id作为参数,查看模型,在现有图像上写入文本,然后输出。

我已经运行了一些基准测试,比较为每个请求生成它与写入磁盘,并使用send_data输出它(如果它已经存在)。我没有注意到这两种方法之间的请求/秒差异很大。

是否有最佳实践来缓存图像或将其写入磁盘而不是为每个请求动态生成图像?一旦生成,这些图像将保持大部分静态,但我也希望在一定的时间间隔后重新生成它。

3 个答案:

答案 0 :(得分:5)

最佳做法是缓存生成的图像并允许Web服务器为其提供服务。

在Rails应用程序前使用Apache或Nginx等Web服务器,并确保将图像写入Web服务器可以提供的位置。因此,如果您的Rails路由评估为/dynamic_images/3.png(调用{= 1}}操作dynamic_images_controller且ID = 3且格式= png),请将该图像写入show并使用{{1在控制器中发送它。

下次请求该文件(public/dynamic_images/3.png)时,网络服务器很乐意为其提供服务(缓存),并且Rails应用程序永远不会被点击。

对于高级需求,例如重新生成图像以及清理控制器代码,请查看paperclip gem。

答案 1 :(得分:2)

只是一个想法(从未尝试过):为什么不用memache存储图像(尤其是动态生成的图像)​​?

Rails.cache.write(“MY_IMAGE”,image)

答案 2 :(得分:1)

您应该将缓存的图像放入Web服务器将为其提供服务的目录中。你不想为此使用send_data - 这太慢了。 此外,您可能希望忽略VCS中的该目录。