Das Caching dynamische Bilder in Rails
-
22-07-2019 - |
Frage
Ich bin mit dem RMagick gem zur Erzeugung dynamische Bilder von einem Controller. Die Steuerung nimmt eine ID als param, ein auf einem Modell zu sehen ist, schreibt Text über ein vorhandenes Bild und gibt es.
Ich habe einige Benchmarks führen Sie es für jede Anforderung im Vergleich Schreiben auf die Festplatte zu vergleichen Erzeugung und Verwendung von send_data
um es auszugeben, wenn es bereits vorhanden ist. Ich habe nicht viel Unterschied in Anfragen / Sekunde zwischen diesen beiden Methoden bemerkt.
Gibt es eine bewährte Methode, um das Bild für das Caching oder auf die Festplatte zu schreiben, anstatt sie zu erzeugen, dynamisch für jede Anforderung? Einmal erzeugt, würden diese Bilder meist statisch bleiben, aber ich würde wie die Option auch wieder erzeugt sie nach einem bestimmten Zeitintervall.
Lösung
Die beste Vorgehensweise ist es, erzeugen Bilder Cache und ermöglicht es dem Webserver sie zu dienen.
Verwenden Sie einen Webserver wie Apache oder Nginx vor Ihrer Rails-Anwendung, und stellen Sie sicher, dass Sie das Bild an einen Ort schreiben, wo der Webserver es dienen kann. Also, wenn Ihr Rails Weg /dynamic_images/3.png
auswertet (das nennt dynamic_images_controller
Aktion show
mit id = 3 und format = png), schreiben Sie das Bild in public/dynamic_images/3.png
und verwendet send_file
in der Steuerung um sie zu senden.
Das nächste Mal die Datei angefordert wird (/dynamic_images/3.png
), wird der Webserver gerne sie dient (gecached) und die Rails-Anwendung wird nie getroffen zu werden.
Für fortgeschrittene Bedürfnisse, wie die Bilder neu zu erzeugen, und der Controller-Code Reinigung, haben einen Blick auf die Büroklammer gem.
Andere Tipps
Nur eine Idee (nie versucht): warum nicht speichern Bilder (vor allem diejenigen, die dynamisch erzeugt werden) mit memache
Rails.cache.write ( "MY_IMAGE", Bild)
Sie sollten im Cache gespeicherten Bilder setzen in ein solches Verzeichnis von wo sie vom Web-Server bedient werden. Sie wollen nicht send_data für diesen Einsatz - das ist zu langsam. Auch Sie werden wahrscheinlich das Verzeichnis in Ihrem VCS ignoriert werden sollen.