web-dev-qa-db-fra.com

Création de fichiers temporaires dans Heroku

J'ai une application hébergée @ Heroku. L'application dépend de certains flux récupérés à l'aide d'un écouteur de socket. L'écouteur de socket obtient une ligne de XML par seconde. Une fois que je détecte le signal de fin de fichier provenant de l'écouteur, je télécharge le fichier sur les serveurs Amazon S3. Mais, jusqu'à la réception du signal de fin de fichier, est-il possible d'enregistrer le contenu du fichier en tant que fichier temporaire dans Heroku?

24
Satya Kalluri

Vous pourrez peut-être utiliser le répertoire #{Rails_ROOT}/tmp/ ou Rails.root.join('tmp').to_s:

Aspen & Bamboo
[...]
Deux répertoires sont inscriptibles: ./tmp et ./log (sous la racine de votre application).
[...] 

Cèdre
Cedar propose un système de fichiers inscriptible et éphémère. Vous pouvez écrire sur le disque où vous voulez. Vos modifications seront perdues au redémarrage et à la relance de dyno.

Rails_ROOT est destiné aux anciennes versions de Rails, Rails.root aux nouvelles versions.

Bien sûr, vous ne pouvez pas compter sur quoi que ce soit pour survivre, il n’ya aucune garantie que vous travaillerez avec le même dyno.

Si vous restez dans le même processus ou dans la même requête, Rails.root.join('tmp') devrait être utilisable. Si vous avez besoin de données temporaires pour survivre dans des requêtes ou des processus, utilisez plutôt quelque chose d'autre (tel que MongoDB ou PostgreSQL) comme base de collecte pour vos données avant leur acheminement vers S3.


Merci à Benjamin Wheeler pour l’avertissement concernant le changement de Rails_ROOT à Rails.root.

47
mu is too short

La documentation relative au système de fichiers en lecture seule de Heroku explique que vous pouvez utiliser #{Rails_ROOT}/tmp mais ne donne aucun exemple pour générer un nom de fichier temporaire. Cela garantira l'unicité du nom de fichier:

prefix = 'mydata'
suffix = '.xml'
Tempfile.new [prefix, suffix], "#{Rails.root}/tmp"

Notez que "rien ne garantit que ce fichier sera présent lors des demandes ultérieures (bien qu'il puisse l'être), il ne doit donc pas être utilisé pour un type quelconque de stockage permanent."

15
Turadg

Avec la nouvelle Heroku-16 stack, vous pouvez écrire à la fois dans la racine et dans /tmp

Essayez d'écrire pour rooter avec

f = File.new("filename.txt", 'w')
f << "hi there"
f.close

Dir.entries(Dir.pwd) # see your newly created file

Ou à /tmp avec 

f = File.new("tmp/filename.txt", 'w')
f << "hi there"
f.close

Dir.entries(Dir.pwd.to_s + ("/tmp"))

Vous verrez votre nouveau fichier parmi ceux répertoriés dans les deux cas.

Essayez également de lancer heroku restart pour voir vos fichiers nouvellement créés disparaître! Ceci est à prévoir, car le stockage heroku est éphémère (sera supprimé au redémarrage de l'application). Ne vous fiez donc pas à cela pour autre chose qu'un stockage (très) temporaire.

0
user5783745