con*_*t47 5 ruby ruby-on-rails http
我正在测试一段代码来定期ping我拥有的一堆网站,以确保它们正常运行.
我正在使用rails,到目前为止,我有这个可怕的测试操作,我正在尝试使用它(见下文).
但问题是,有时它会起作用,有时它不会......有时它会很好地运行代码,有时候,它似乎完全忽略了开始/救援块......
一个.我需要帮助找出问题所在.并重构这一点,使其看起来很可敬.
非常感谢您的帮助.
编辑1:这是更新的代码,抱歉花了这么长时间,pastie.org自昨天以来一直在下降http://pastie.org/927201
它仍在做同样的事情...跳过开始块(因为它只更新up_check_time)...但是如果其中一个站点超时,它实际上正确地更新了所有内容(check_msg,代码等)...令人困惑,是吗?
require 'net/http'
require 'uri'
def ping
@sites = NewsSource.all
@sites.each do |site|
if site.uri and !site.uri.empty?
uri = URI.parse(site.uri)
response = nil
path = uri.path.blank? ? '/' : uri.path
path = uri.query.blank? ? path : "#{path}?#{uri.query}"
begin
Net::HTTP.start(uri.host, uri.port) {|http|
http.open_timeout = 30
http.read_timeout = 30
response = http.head(path)
}
if response.code.eql?('200') or response.code.eql?('301') or response.code.eql?('302')
site.up = true
else
site.up = false
end
site.up_check_msg = response.message
site.up_check_code = response.code
rescue Errno::EBADF
rescue Timeout::Error
site.up = false
site.up_check_msg = 'timeout'
site.up_check_code = '408'
end
site.up_check_time = 0.seconds.ago
site.save
end
end
end
Run Code Online (Sandbox Code Playgroud)
这是我的一个程序的片段,也许有帮助:
urls.each_with_index do |url, idx|
print "Processing URL #%04d: " % (idx+1)
uri = URI.parse(url)
response = nil
begin
Net::HTTP.start(uri.host, uri.port) do |http|
response = http.head(uri.path.size > 0 ? uri.path : "/")
end
rescue => e
puts "#{e.message} - #{url}"
next
end
# handle redirects
if response.is_a?(Net::HTTPRedirection)
new_uri = URI.parse(response['location'])
puts "URI redirects to #{new_uri}"
next
end
puts case response.code
when '200' then ...
when '404' then ...
else ...
end
end
Run Code Online (Sandbox Code Playgroud)