有时ping网站的代码

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)

Mic*_*ohl 1

这是我的一个程序的片段,也许有帮助:

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)