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?
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
.
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."
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.