【问题标题】:Creating temporary files in Heroku在 Heroku 中创建临时文件
【发布时间】:2011-07-12 08:27:38
【问题描述】:

我有一个由@Heroku 托管的应用程序。该应用程序依赖于使用套接字侦听器获取的一些提要。套接字侦听器每秒获取一行 XML。一旦检测到来自侦听器的文件结束信号,我就会将文件上传到 Amazon S3 服务器。但是,在收到文件结束信号之前,是否可以将文件内容保存为 Heroku 中的临时文件?

【问题讨论】:

    标签: ruby-on-rails heroku


    【解决方案1】:

    您也许可以使用the #{RAILS_ROOT}/tmp/ directoryRails.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

    【讨论】:

    • @satya:我会使用某种数据库,这样如果出现问题就不会丢失任何东西。
    • 好的。感谢您的建议。
    • +1 @mu 太短我很惊讶地注意到文件实际上被上传了。这澄清了。
    • 仅供参考,更新后的 Rails 4 方法是 Rails.root,而不是 RAILS_ROOT:例如,“#{Rails.root}/tmp/”
    • @BenjaminWheeler 感谢您的提醒。
    【解决方案2】:

    documentation on Heroku's read-only file system 解释说您可以使用#{RAILS_ROOT}/tmp,但没有给出任何生成临时文件名的示例。这将保证文件名的唯一性:

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

    请注意,“无法保证此文件会在后续请求中存在(尽管可能存在),因此不应将其用于任何类型的永久存储。”

    【讨论】:

    【解决方案3】:

    使用较新的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 存储是短暂的(将在应用程序重新启动时被删除) - 所以除了(非常)临时存储之外,不要依赖它

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多