Скрипт для установки пакетов

Если вы действительно просматриваете файлы, вы можете выполнить запрос HEAD по URL-адресу, и сервер должен вернуть ключ («etag»), который сообщит вам, изменился ли файл. На сервере Apache это основано на ctime файла, поэтому тег etag может измениться, даже если файл не изменился.

Но поскольку для меня сеть, вероятно, дороже записи на диск, если вы загружаете содержимое файла, вы можете просто сохранить его на диск.

Вы не говорите, сколько файлов и насколько они велики. Если существует большое количество файлов или файлов требуется очень много времени для загрузки этого сценария или если вы хотите поместить минимальную нагрузку на сервер, этот сценарий следует изменить так, чтобы каждый запрос выполнялся один раз в минуту или так часто. по возможности, если загрузка занимает больше минуты.

Ниже приведен очень простой сценарий Ruby, который, я думаю, сделает то, что вы хотите:

#! / Usr / bin / env ruby ​​

require 'getoptlong'
require 'net/https'
require 'json'
require 'fileutils'

def main(roots, **options)
  cache = Hash.new

  cache = Hash.new
  ok = true
  path = options[:path]
  while (ok)
    roots.each do |root|
      uri = URI.parse(root)
      http = Net::HTTP.new(uri.host, uri.port)
      case uri.scheme
      when 'https'
        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      when 'http'
      else
        raise "unknow type #{uri.to_s}"
      end

      need_get = true
      if (c = cache[uri.request_uri])
        response = http.request(Net::HTTP::Head.new(uri.request_uri))
        if response.code.to_i == 200
          if response['etag'] == c['etag']
            need_get = false
          end
        end
      end

      if need_get
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
        cache[uri.request_uri] = { 'etag' => response['etag'] }
        filename = File.join(path, uri.request_uri)
        need_write = true
        if File.exist?(filename)
          # you could check if the file changed here, but it does not save you much.
        end
        if need_write
          File.open(filename, 'w') { |file| file.write(response.body) }
        end
      end
    end
    sleep 30
  end
end

begin
  main([http://example.com/ten.html, http://example.com/eleven], { path: "/tmp/downloaded_files" })
rescue => error
  puts error
end
0
19.06.2015, 02:58
0 ответов

Теги

Похожие вопросы