Ruby on rails Ruby';s';打开uri';读取或失败后可靠地关闭插座?

Ruby on rails Ruby';s';打开uri';读取或失败后可靠地关闭插座?,ruby-on-rails,ruby,ruby-on-rails-3,screen-scraping,Ruby On Rails,Ruby,Ruby On Rails 3,Screen Scraping,一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续收到“530抱歉,已连接了最大允许客户端数(95)” 我不确定我的代码是否有错,或者是其他人在访问服务器,不幸的是,我似乎无法真正确定谁有错 本质上,我是通过以下方式阅读FTP URI的: def self.read_uri(uri) begin uri = open(uri).read uri == "Error" ? nil : uri rescue OpenU

一段时间以来,我一直在使用
open_uri
下拉ftp路径作为数据源,但突然发现我几乎连续收到“530抱歉,已连接了最大允许客户端数(95)”

我不确定我的代码是否有错,或者是其他人在访问服务器,不幸的是,我似乎无法真正确定谁有错

本质上,我是通过以下方式阅读FTP URI的:

  def self.read_uri(uri)
    begin
      uri = open(uri).read
      uri == "Error" ? nil : uri
    rescue OpenURI::HTTPError
      nil
    end
  end
我猜我需要在这里添加一些额外的错误处理代码。。。 我想确保我采取了一切预防措施来关闭所有连接,这样我的连接就不会成为问题所在,但是我认为open_uri+read会采取这种预防措施,而不是使用Net::FTP方法

底线是,我必须100%确定这些连接正在关闭,并且我不会有一堆打开的连接

有人能建议正确使用read_uri拉入ftp,并保证它正在关闭连接吗?或者我应该将逻辑转移到Net::FTP,如果open_uri不够健壮,它可以对情况产生更多的控制

如果我确实需要使用Net::FTP方法,那么有没有一种读取方法我应该熟悉,而不是将其下拉到tmp位置,然后读取它(如果可能的话,我更喜欢将其保存在缓冲区中而不是fs中)?

尝试使用块:

data = open(uri){|f| f.read}

我怀疑你没有关把手。从以下评论开始:

It is possible to open http/https/ftp URL as usual like opening a file:

open("http://www.ruby-lang.org/") {|f|
  f.each_line {|line| p line}
}
我查看了源代码,
open\u uri
方法会在传递块时关闭流,因此,调整上述示例以适合您的代码:

uri = ''
open("http://www.ruby-lang.org/") {|f|
  uri = f.read
}
应该能让你接近你想要的


这里有一种处理异常的方法:

# The list of URLs to pass in to check if one times out or is refused.
urls = %w[
  http://www.ruby-lang.org/
  http://www2.ruby-lang.org/
]

# the method
def self.read_uri(urls)

  content = ''

  open(urls.shift) { |f| content = f.read }
  content == "Error" ? nil : content

  rescue OpenURI::HTTPError
    retry if (urls.any?)
    nil
end

我不熟悉
read\u uri
,并且在查找搜索结果时遇到了惊人的困难。你介意分享一段需要和/或使用它的代码吗?哈哈,对不起。几个月前我写了这段代码,但忘记了我定义了如下的read_uri(当时意识到我需要添加更多的错误处理:假设您不运行windows,那么您可能会看到运行“netstat”时发生了什么)在命令提示符下。好主意@sunkencity,但是在heroku上运行几个实例会增加场景的复杂性。可能有4个不同的应用程序实例中的任何一个都可能有违规连接,因此我想在真正深入研究哪个客户端可能有现有连接之前,确保我已经完全处理了异常我想是的。但我会在其中一台服务器上四处搜索,看看它是否有僵尸连接。好的,是的,我相信你在这里是正确的。我在搜索了一些服务器后发现了同样的东西。谢谢!我会尝试一下,看看事情现在是否平静下来。好吧,很高兴知道现在不是我。不过,我仍然发现了太多连接的错误。当出现这种情况时,我需要切换到备份服务器。您将如何为此添加异常处理程序,以便在抛出错误时,尝试进入另一个URI?您可能也会遇到这样的情况,即TCP将在连接关闭后保留一段时间,但我不记得这段时间有多长。您可能是不过,在该窗口内搜索太多文件,耗尽了可用的数量。我还建议您查看和Hydra。Typhous是一个很棒的HTTP客户端,它将为您尝试执行的操作提供强大的功能和控制。有几种方法可以处理异常,但至少您可以包装您的“get”然后用另一个URL重试。我将添加一个建议的示例。是的,谢谢。该块似乎有帮助。希望我可以拆分答案,因为我看不出是谁首先发布的,但由于另一个答案有更多的详细信息,我将继续并将其指定为答案。但是谢谢!