1

使用 Feedzirra 时出现 LoadError - “打开的文件过多”。我使用默认的 WEBrick 服务器在我的开发服务器上运行它。

我只解析 2 个提要。问题是什么?

4

1 回答 1

0

我对 Feedzirra 也有同样的问题。您会注意到它使 TCP 连接CLOSE_WAIT永远处于状态,从而导致问题。

它似乎curb是用于获取提要的特定于宝石的。另一个依赖 libcurl 的项目也有同样的问题。他们通过设置“CURLOPT_FORBID_REUSE”选项来修复它。

我尝试为 Feedzirra 做同样的事情,但没有成功。即使有了这个选项,我最终还是有越来越多的CLOSE_WAIT会话和Too many open files错误。

所以我做了最直接的事情,我使用以下方式下载提要Net::HTTP

def get_contents(furl)
  url = URI.parse(furl)
  req = Net::HTTP::Get.new(url.to_s)

  res = Net::HTTP.start(url.host, url.port) { |http|
    http.request(req)
  }

  unless res.kind_of? Net::HTTPSuccess
    puts "can't get feed #{url.to_s}: #{res.code}"
    return nil
  end

  res.body
end

然后我用 Feedzirra 解析 XML:

xml = get_contents(furl)
feedin = Feedzirra::Feed.parse xml

没有更多的卡住连接,也没有更多的错误。您可能还希望在此示例代码中添加更好的错误处理。

于 2014-01-11T22:58:10.513 回答