Создание временных файлов в Heroku - PullRequest
24 голосов
/ 12 июля 2011

У меня есть приложение, размещенное @ Heroku. Приложение зависит от некоторых каналов, которые выбираются с помощью прослушивателя сокетов. Слушатель сокета получает одну строку XML в секунду. Обнаружив сигнал окончания файла от слушателя, я загружаю файл на серверы Amazon S3. Но до тех пор, пока не получен сигнал об окончании файла, возможно ли сохранить содержимое файла как временный файл в Heroku?

Ответы [ 3 ]

47 голосов
/ 12 июля 2011

Вы можете использовать каталог #{RAILS_ROOT}/tmp/ или Rails.root.join('tmp').to_s:

Осина и бамбук
[...]
Для записи доступны две директории: ./tmp и ./log (в корневом каталоге приложения).
[...]

Cedar
Кедр предлагает эфемерную записываемую файловую систему.Вы можете записывать на диск где угодно.Ваши изменения будут потеряны при перезапуске и ускорении dyno.

RAILS_ROOT для более старых версий Rails, Rails.root для более новых версий.

Вы не можете зависетьКонечно, для всего, что сохранилось в запросах, нет гарантии, что вы даже будете работать с одним и тем же dyno.

Пока вы остаетесь в том же процессе или запросе, Rails.root.join('tmp') должно быть пригодно для использования.Если вам нужны временные данные для выживания в запросах или процессах, вам лучше использовать что-то другое (например, MongoDB или PostgreSQL) в качестве основы для сбора ваших данных на пути к S3.


Спасибо Бенджамину Уилеру за новости об изменении RAILS_ROOT на Rails.root.

15 голосов
/ 28 января 2013

Документация в файловой системе Heroku только для чтения объясняет, что вы можете использовать #{RAILS_ROOT}/tmp, но не дает никаких примеров для генерации временного имени файла.Это гарантирует уникальность имени файла:

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

Обратите внимание, что «нет никаких гарантий, что этот файл будет там при последующих запросах (хотя это может быть), поэтому его не следует использовать ни для какого видапостоянное хранение. "

0 голосов
/ 17 февраля 2019

С более новым стеком Heroku-16 вы можете записывать в корень и в /tmp

Попробуйте написать в root с

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

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

Или /tmp с

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

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

Вы увидите ваш новый файл среди перечисленных в обоих случаях

Также попробуйте запустить heroku restart, чтобы увидеть, что ваши вновь созданные файлы исчезли! Это ожидаемо, поскольку хранилище heroku эфемерно (будет удалено при перезапуске приложения), поэтому не полагайтесь на него больше, чем на (очень) временное хранилище

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...