通过会话变量缓存FTP连接以通过AJAX使用?

时间:2010-04-30 16:31:34

标签: ruby ftp

我正在使用Net :: FTP库的Ruby Web应用程序。其中一部分允许用户通过AJAX与FTP站点进行交互。当用户执行某些操作并进行AJAX调用,然后Ruby重新连接到FTP服务器,执行操作并输出信息。

每次进行AJAX调用时,Ruby都必须重新连接到FTP服务器,而且速度很慢。有没有办法可以缓存这个FTP连接?我已尝试在会话哈希中进行缓存,但“我们很抱歉,但出现了问题”,并且每当我尝试将其存储在会话哈希中时,我的日志中都会输出TCP转储。我还没有尝试过memcache。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

AJAX无法直接与FTP通信。它专为HTTP设计。这并不能阻止你写一些缓存FTP服务器的东西。您可能应该对其进行分析以找出真正慢的内容。我的猜测是FTP访问速度很慢。缓存它可能是一个喜忧参半的祝福。你怎么知道ftp网站的内容何时发生变化?

答案 1 :(得分:1)

你想要做什么 是可能的,但远非琐碎,而且Rails不提供任何内置的支持。实际上,您需要下降到操作系统级别才能完成此操作,如果您有多个物理服务器,那么它将变得更加复杂。

首先,您无法在会话中存储连接。事实上,您不希望在会话中存储任何Ruby对象有多种原因,包括但不限于:

  • 某些类型的对象无法编组/解组
  • 如果模型发生变化且人们的会话中序列化的内容过时,部署可能会破坏内容
  • 如果您使用的是Cookie会话商店,那么您只有4k

所以一般来说,你只想把字符串,数字和布尔等原语放到会话中。

现在就FTP连接而言,这属于无法可靠地序列化/反序列化的事物类别。原因是因为它不仅仅是一个Ruby对象,而且还有一个打开的套接字,一旦原始对象被垃圾收集,它就会被关闭。

因此,为了保持FTP连接的持久性,它不能存储在控制器实例变量中,因为控制器实例是按请求的。您可以尝试将其实例化到控制器实例之外的某个位置,但是如果您不是非常小心地清理连接,则可能会发生内存泄漏,此外,如果您有多个应用服务器实例,那么您还需要找到一种方法来保证用户在每个请求上与同一个应用服务器实例进行通信,否则它将无法找到钩子。总而言之,在Ruby流程中保持会话开放是不可能的。

您需要做的是在任何ruby进程可以与之交谈的单独进程中打开连接。实际上没有既定的标准方法,你必须自己动手。您可以查看DRb以提供您需要的一些原语。