Railsでの動的画像のキャッシュ
-
22-07-2019 - |
質問
コントローラーから動的画像を生成するためにrmagick gemを使用しています。コントローラーはidをパラメーターとして受け取り、モデルを検索し、既存のイメージにテキストを書き込んで出力します。
すべてのリクエストに対して生成することとディスクに書き込むことを比較し、既に存在する場合は send_data
を使用して出力するベンチマークを実行しました。これらの2つの方法の1秒あたりのリクエスト数に大きな違いはありません。
リクエストごとに動的に生成するのではなく、イメージをキャッシュするかディスクに書き込むためのベストプラクティスはありますか?一度生成されると、これらの画像はほとんど静的なままですが、特定の時間間隔後に再生成するオプションも欲しいです。
解決
ベストプラクティスは、生成された画像をキャッシュし、ウェブサーバーがそれらを提供できるようにすることです。
Railsアプリの前でApacheやNginxなどのWebサーバーを使用し、Webサーバーが提供できる場所にイメージを書き込むようにしてください。したがって、Railsルートが /dynamic_images/3.png
(id = 3およびformat = pngで dynamic_images_controller
アクション show
を呼び出す)に評価される場合、その画像を public / dynamic_images / 3.png
に書き込み、コントローラーで send_file
を使用して送信します。
次回そのファイルが要求されたとき( /dynamic_images/3.png
)、ウェブサーバーは喜んでそのファイルを提供(キャッシュ)し、Railsアプリはヒットしません。
画像の再生成、コントローラーコードのクリーンアップなどの高度なニーズについては、 paperclipをご覧ください。 gem。
他のヒント
ただのアイデア(試したことがない):memacheで画像(特に動的に生成されたもの)を保存してみませんか?
Rails.cache.write(" MY_IMAGE&quot ;, image)
キャッシュされた画像は、Webサーバーが提供するディレクトリにキャッシュする必要があります。これにはsend_dataを使用したくありません-それは遅すぎます。 また、VCS内のそのディレクトリを無視することをお勧めします。