Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Net::HTTP超时_Ruby_Http_Timeout - Fatal编程技术网

Ruby Net::HTTP超时

Ruby Net::HTTP超时,ruby,http,timeout,Ruby,Http,Timeout,我正试图编写我的第一个Ruby程序,但遇到了一个问题。代码必须通过HTTP下载32个MP3文件。它实际上下载了一些,然后超时 我试着设置一个超时时间,但没有什么区别。在Windows、Cygwin和Mac OS X下运行代码会得到相同的结果 代码如下: require 'rubygems' require 'open-uri' require 'nokogiri' require 'set' require 'net/http' require 'uri' puts "\n Up and r

我正试图编写我的第一个Ruby程序,但遇到了一个问题。代码必须通过HTTP下载32个MP3文件。它实际上下载了一些,然后超时

我试着设置一个超时时间,但没有什么区别。在Windows、Cygwin和Mac OS X下运行代码会得到相同的结果

代码如下:

require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'set'
require 'net/http'
require 'uri'

 puts "\n Up and running!\n\n"

 links_set = {}

 pages = ['http://www.vimeo.com/siai/videos/sort:oldest',
   'http://www.vimeo.com/siai/videos/page:2/sort:oldest',
   'http://www.vimeo.com/siai/videos/page:3/sort:oldest']

 pages.each do |page|
  doc = Nokogiri::HTML(open(page))
  doc.search('//*[@href]').each do |m|
   video_id = m[:href]
   if video_id.match(/^\/(\d+)$/i)
     links_set[video_id[/\d+/]] = m.children[0].to_s.split(" at ")[0].split(" -- ")[0]
    end
   end
 end

 links = links_set.to_a

 p links

 cookie = ''
 file_name = ''

 open("http://www.tubeminator.com") {|f|
   cookie = f.meta['set-cookie'].split(';')[0]
 }

 links.each do |link|
  open("http://www.tubeminator.com/ajax.php?function=downloadvideo&url=http%3A%2F%2Fwww.vimeo.com%2F" + link[0],
   "Cookie" => cookie) {|f|
      puts f.read
  } 

  open("http://www.tubeminator.com/ajax.php?function=convertvideo&start=0&duration=1120&size=0&format=mp3&vq=high&aq=high",
   "Cookie" => cookie) {|f|
      file_name = f.read
   }
  puts file_name

  Net::HTTP.start("www.tubeminator.com") { |http|
   #http.read_timeout = 3600 # 1 hour
     resp = http.get("/download-video-" + file_name)
     open(link[1] + ".mp3", "wb") { |file|
        file.write(resp.body)
     }
    }  
 end 

 puts "\n Yay!!"
这是个例外:

/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:140:in `rescue in rbuf_fill': Timeout::Error (Timeout::Error)
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:134:in `rbuf_fill'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:116:in `readuntil'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:126:in `readline'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:2138:in `read_status_line'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:2127:in `read_new'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:1120:in `transport_request'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:1106:in `request'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:312:in `block in open_http'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:564:in `start'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:767:in `buffer_open'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:669:in `open'
 from /Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open-uri.rb:33:in `open'
 from test.rb:38:in `block in <main>'
 from test.rb:37:in `each'
 from test.rb:37:in `<main>'
/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:140:in“在rbuf_填充中救援”:超时::错误(超时::错误)
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:134:in'rbuf_fill'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:116:in'readuntil'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/protocol.rb:126:in'readline'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:2138:“读取状态”行中
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:2127:in'read_new'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:1120:“传输请求”中的
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:1106:in'request'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open uri.rb:312:in'block in open_http'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/net/http.rb:564:in'start'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:306:in'open_http'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:767:in'buffer_open'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/open uri.rb:203:“开环中的块”中
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:201:in'catch'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:201:在“开环”中
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:146:in'open_uri'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:669:in'open'
from/Users/test/.rvm/rubies/ruby-1.9.2-preview1/lib/ruby/1.9.1/openuri.rb:33:in'open'
来自测试。rb:38:in'block in'
来自测试。rb:37:in‘each’
来自测试。rb:37:in`'

我也非常感谢您对代码其余部分的评论。

您设置的超时不在代码中。在这里,您可以使用开放uri:

open("http://www.tubeminator.com/ajax.php?function=downloadvideo&url=http%3A%2F%2Fwww.vimeo.com%2F" + link[0],
您可以设置打开uri的读取超时,如下所示:

#!/usr/bin/ruby1.9

require 'open-uri'

open('http://stackoverflow.com', 'r', :read_timeout=>0.01) do |http|
  http.read
end

# => /usr/lib/ruby/1.9.0/net/protocol.rb:135:in `sysread': \
# => execution expired (Timeout::Error)
# => ...
# =>         from /tmp/foo.rb:5:in `<main>'
#/usr/bin/ruby1.9
需要“打开uri”
开放('http://stackoverflow.com','r',:read_timeout=>0.01)do | http|
http.read
结束
#=>/usr/lib/ruby/1.9.0/net/protocol.rb:135:in'sysread':\
#=>执行已过期(超时::错误)
# => ...
#=>from/tmp/foo.rb:5:in`'

:read_timeout
是Ruby 1.9的新功能(它不在Ruby 1.8中)。0或nil表示“没有超时”。对于Ruby 1.8,我用它来解决超时问题。在我的代码中扩展Net::HTTP类,并使用默认参数重新初始化,包括初始化我自己的
read\u timeout
,我认为应该可以让事情保持正常

require 'net/http'

# Lengthen timeout in Net::HTTP
module Net
    class HTTP
        alias old_initialize initialize

        def initialize(*args)
            old_initialize(*args)
            @read_timeout = 5*60     # 5 minutes
        end
    end
end

在为视频下载构建url时,可能出现了一些问题。选择有问题的url并尝试手动下载。嗨,Lucas:)url正常,我可以用浏览器下载文件。问题是下载更大的文件(大约20MB)时超时。你知道Ruby 1.8解决方案吗?@madh,我不知道,但可以使用wget。你可以设置Net::HTTP对象的读取超时和连接超时。替代方法:使用加铺。这个API很奇怪,但它没有任何Net::HTTP超时问题(只适用于Ruby 1.8.x)。工作起来很有魅力。谢谢你的帮助!谢谢你,你就像一位天使,就在我需要你的时候从天堂降临。@Darren很高兴我能帮上忙:-)Nick,你可以把这段代码放在你的应用程序层次结构中的任何地方,因为它保存的文件在运行时是加载/需要的。@RansomAni Gizzle,你为什么不说
http=Net::http.new而这样做呢(uri.host,uri.port);http.open_timeout=5*60;http.read_timeout=5*60
就像我在这里@Grienders做的那样,因为我需要将解决方案模块化并实例化一次。您的解决方案也可以工作,但如果您在另一个文件中使用变量http而不使其全局化,则必须重新执行“Net::http.new(uri.host,uri.port)”;http.open_timeout=5*60;http.read_timeout=5*60“在不同的文件中反复出现,而你可以把它放在一个重要的地方。我会发现这很混乱。我想这只是个人喜好。:-)