Если вы действительно просматриваете файлы, вы можете выполнить запрос 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