Загружайте только новые / измененные файлы с помощью perl (или wget) - PullRequest
3 голосов
/ 05 августа 2010

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

Можно ли заставить сервер отправлять HTTP 304 вместо HTTP 200 для неизмененных файлов?

Ответы [ 2 ]

5 голосов
/ 05 августа 2010

Да, используйте LWP::UserAgent и обратите особое внимание на метод mirror. Это также доступно в процедурном LWP::Simple как функция mirror.

Из LWP POD:

Этот метод получит документ, идентифицированный $ url, и сохранит его в файле с именем $ filename. Если файл уже существует, то запрос будет содержать заголовок «If-Modified-Since», соответствующий времени изменения файла. Если документ на сервере с тех пор не изменился, то ничего не происходит. Если документ был обновлен, он будет загружен снова. Время модификации файла будет соответствовать времени сервера.

Возвращаемым значением является объект ответа.

HTTP 304 - это код ответа, который сервер вернет, если вы пройдете тест If-Modified-Since, и ваша копия свежая. LWP делает это внутренне с mirror - вам не нужно об этом беспокоиться.

1 голос
/ 05 августа 2010

Это основано на ответе Эвана Кэррола, но я собираюсь уточнить, если это будет полезно для кого-то еще.Я заглушил раздел ответа;Я сомневаюсь, что часть моего кода будет интересна.

#!/usr/bin/perl -w

require HTTP::Date;
require LWP::UserAgent;
require Date::Parse;

my $lastChecked = '2009-01-01';
my $ua = LWP::UserAgent->new;
$ua->default_header('If-Modified-Since' => HTTP::Date::time2str(Date::Parse::str2time($lastChecked)));

my $response = $ua->get('http://example.com/');

if ($response->code == 304) {
    print "No changes.\n";
} elsif ($response->is_success) {
    print $response->decoded_content;
} else {
    print "Response was error " . $response->code . ": '" . $response->status_line . "'\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...