【发布时间】:2011-07-12 08:27:38
【问题描述】:
我有一个由@Heroku 托管的应用程序。该应用程序依赖于使用套接字侦听器获取的一些提要。套接字侦听器每秒获取一行 XML。一旦检测到来自侦听器的文件结束信号,我就会将文件上传到 Amazon S3 服务器。但是,在收到文件结束信号之前,是否可以将文件内容保存为 Heroku 中的临时文件?
【问题讨论】:
标签: ruby-on-rails heroku
我有一个由@Heroku 托管的应用程序。该应用程序依赖于使用套接字侦听器获取的一些提要。套接字侦听器每秒获取一行 XML。一旦检测到来自侦听器的文件结束信号,我就会将文件上传到 Amazon S3 服务器。但是,在收到文件结束信号之前,是否可以将文件内容保存为 Heroku 中的临时文件?
【问题讨论】:
标签: ruby-on-rails heroku
您也许可以使用the #{RAILS_ROOT}/tmp/ directory 或Rails.root.join('tmp').to_s:
白杨和竹子
[...]
有两个可写目录:./tmp和./log(在您的应用程序根目录下)。
[...]雪松
Cedar 提供了一个短暂的可写文件系统。您可以在任何您想要的地方写出到磁盘。您的更改将在 dyno 重新启动和启动时丢失。
RAILS_ROOT 用于旧版 Rails,Rails.root 用于较新版本。
当然,你不能依赖任何在请求中幸存的东西,不能保证你甚至会使用同一个测功机。
只要您停留在同一个进程或请求中,Rails.root.join('tmp') 应该是可用的。如果您需要临时数据在请求或进程之间存在,那么您最好使用其他东西(例如 MongoDB 或 PostgreSQL)作为数据在 S3 途中的收集地。
感谢Benjamin Wheeler 提醒您将RAILS_ROOT 更改为Rails.root。
【讨论】:
documentation on Heroku's read-only file system 解释说您可以使用#{RAILS_ROOT}/tmp,但没有给出任何生成临时文件名的示例。这将保证文件名的唯一性:
prefix = 'mydata'
suffix = '.xml'
Tempfile.new [prefix, suffix], "#{Rails.root}/tmp"
请注意,“无法保证此文件会在后续请求中存在(尽管可能存在),因此不应将其用于任何类型的永久存储。”
【讨论】:
使用较新的Heroku-16 堆栈,您可以向根和写入/tmp
尝试写入根目录
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 存储是短暂的(将在应用程序重新启动时被删除) - 所以除了(非常)临时存储之外,不要依赖它
【讨论】: