热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Heroku多重dynos上使用载波缓存?-HowtousecarrierwavecacheonHerokumultipledynos?

IhaveanappwithCarrierwaveonHeroku.Onapage,Ihave2forms:1ajaxformforuploadingapic

I have an app with Carrierwave on Heroku. On a page, I have 2 forms: 1 ajax form for uploading a picture and 1 normal form for additional information needed to create the object. Suppose my Carrierwave mount is :picture, every time the ajax form is submitted, the picture is saved temporarily into the public folder and its path is returned as :picture_cache. The second form then uses that to know which picture to be created with the new object on the second request. This works fine for a single dyno.

我有一个在Heroku上有Carrierwave的应用。在一个页面上,我有两个表单:一个用于上传图片的ajax表单,另一个用于创建对象所需的其他信息的普通表单。假设我的Carrierwave mount是:picture,每次提交ajax表单时,图片都会被临时保存到公共文件夹中,其路径返回为:picture_cache。然后,第二个表单使用它来知道在第二个请求中使用新对象创建哪个图片。这适用于单个dyno。

Different dynos don't know about each other's filesystems. Thus if the request to submit the 2nd form doesn't hit the same dyno as the request of the first form, it can't find the image.

不同的dynos不知道彼此的文件系统。因此,如果提交第2个表单的请求与第一个表单的请求不匹配,则无法找到图像。

Has anyone tackled this problem?

有人解决过这个问题吗?

1 个解决方案

#1


2  

i use a custom model and store all files, including tmp ones, in mongodb. the uploads are marked as tmp. ones the models is 'saved' i simply remove the 'tmp' flag. in this way all nodes see all images all the time. it's pretty crazy that the carrierwave default is to cache in ./tmp since many multi-node configuration would see this issue (unless the balancer implements session affinity).

我使用自定义模型并将所有文件(包括tmp文件)存储在mongodb中。上传被标记为tmp。如果模型被“保存”,我只需删除“tmp”标志。这样,所有的节点都可以看到所有的图像。由于许多多节点配置都会遇到这个问题(除非均衡器实现会话关联),所以carrierwave默认值是缓存./tmp。

here is my model and controller, etc: https://gist.github.com/3161569

这是我的模型和控制器,等等:https://gist.github.com/3161569

you have to do some custom work in the form:

你必须在表格中做一些定制工作:

  • save every file posted, no matter what
  • 保存所有上传的文件,无论如何
  • relay the posted file id in a hidden field
  • 在隐藏字段中传递已发布的文件id。
  • on save look for a file and/or previously uploaded id
  • 在保存时,查找文件和/或先前上传的id
  • make the model associations
  • 使模型关联

this approach, although it isn't 'magic' also gives the following awesome side effects:

这种方法虽然不是“魔法”,但也有以下可怕的副作用:

  • you have one process running jobs in the background to thumbnail the images vs. spinning up image_magick whenever a user hits 'submit' (which is a serious DOS vector, esp on memory limited hosts like heroku)

    你有一个进程在后台运行作业来缩略图像,而当用户点击“提交”(这是一个重要的DOS向量,特别是在内存有限的主机上,比如heroku)时,你可以将image_magick旋转起来

  • you can migrate images to s3 in the background, hourly, whatever, and the uploads simply have a new url (in this case the controller need to issue a permanant redirect if it notices this). this is really nice because you can keep 'em in the db for dev, staging, etc. and migrate some, or all, uploads onto s3 whenever without changing any upload or view code.

    您可以在后台将图像迁移到s3中,每小时一次,无论如何,上传的只是一个新的url(在这种情况下,如果控制器注意到这个url,就需要发出永久的重定向)。这真的很好,因为您可以将它们保存在db中用于开发、登台等,并且在不更改任何上载或查看代码的情况下将部分或全部上载迁移到s3。


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
author-avatar
灰太狼老婆红太狼_715
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有