我正在使用 rmagick gem 从控制器生成动态图像。控制器将 id 作为参数,查找模型,在现有图像上写入文本,然后输出。
我已经运行了一些基准测试,比较了为每个请求生成它与写入磁盘并send_data
在它已经存在时使用它来输出它。我没有注意到这两种方法之间的请求/秒有太大差异。
是否有缓存图像或将其写入磁盘而不是为每个请求动态生成图像的最佳实践?一旦生成,这些图像将大部分保持静态,但我也希望在一定时间间隔后重新生成它的选项。
我正在使用 rmagick gem 从控制器生成动态图像。控制器将 id 作为参数,查找模型,在现有图像上写入文本,然后输出。
我已经运行了一些基准测试,比较了为每个请求生成它与写入磁盘并send_data
在它已经存在时使用它来输出它。我没有注意到这两种方法之间的请求/秒有太大差异。
是否有缓存图像或将其写入磁盘而不是为每个请求动态生成图像的最佳实践?一旦生成,这些图像将大部分保持静态,但我也希望在一定时间间隔后重新生成它的选项。
最佳实践是缓存生成的图像并允许网络服务器提供它们。
在 Rails 应用程序前面使用 Apache 或 Nginx 等网络服务器,并确保将图像写入网络服务器可以提供服务的位置。因此,如果您的 Rails 路由计算/dynamic_images/3.png
结果为(调用id=3 和 format=png 的dynamic_images_controller
操作show
),则将该图像写入public/dynamic_images/3.png
并send_file
在控制器中使用以发送它。
下次请求该文件/dynamic_images/3.png
时(
对于高级需求,例如重新生成图像和清理控制器代码,请查看回形针gem。
只是一个想法(从未尝试过):为什么不使用 memache 存储图像(尤其是动态生成的图像)?
Rails.cache.write("MY_IMAGE", image)
您应该将缓存的图像放入这样的目录中,从那里它们将由 Web 服务器提供服务。您不想为此使用 send_data - 这太慢了。此外,您可能希望忽略 VCS 中的该目录。