Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Обновление архивов


Автор: Гость_Alex 22.5.2005, 06:29
Не подскажете как отследить обновление архивов?
Периодическая закачка с помощью LWP и сравнение размеров файлов не подойдет... (Архивы могут быть достаточно большими)
Можно ли как-нибудь получить время модификации архива?

Автор: korob2001 22.5.2005, 09:42
Что ты подразумеваешь под словом архив???

Автор: Гость_Alex 22.5.2005, 22:10
*.zip
*.rar
На данный момент меня интересуют файлы указанных форматов.
Хотя вопрос можно и обобщить.
В общем случае это может относиться и к фаилам *.mp3 и т.д (размеры которых в среднем от 500К и выше).
Маленькие файлы, в крайнем случае, можно периодически заливать к себе и сравнивать размеры старого и нового.
Хотя это тоже не самый лучший выход.
А как поступить с большими файлами (меня интересуют файлы до 5 метров)?
Здесь начинаешь ценить время с учетом последующей обработки и ограничения на время работы скрипта.
Плюс (возможно) оплата трафика. Тогда уж точно часто закачивать большие файлы не получится...

Автор: korob2001 22.5.2005, 22:59
Попробуй это:
Код

my $last_mod = ( stat( $file ) )[9];

В переменной будет сохранено время в секундах с начала эпохи, последней модификации файла.

Автор: Гость_Alex 23.5.2005, 07:58
Я так уже пробовал
Так можно отследить только время модификации своих файлов (на своем компе или в домене, если запустить там же скрипт)
А мне надо узнать время модификации файлов независимо от того, где они лежат...
Может, правда, я что-то не так делаю, но
Код

my $file='http://www.../data.zip';
my $last_mod = ( stat( $file ) )[9];
print $last_mod;

ничего не выдает

Автор: korob2001 23.5.2005, 14:08
Хех smile , а кто же тебе даст такую информацию??? Исполняемый файл должен лежать там же, где и проверяемый архив. А вообще, можешь обьяснить зачем тебе это нужно??? Наверняка есть решение более актуальное.

Автор: Гость_Alex 23.5.2005, 22:55
Цитата
Хех, а кто же тебе даст такую информацию??? Исполняемый файл должен лежать там же, где и проверяемый архив.

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

Цитата
А вообще, можешь обьяснить зачем тебе это нужно???

Хочу сделать что-то вроде сборника прайс-листов. Вернее работа уже идет. Теперь понемногу оптимизирую код.

Цитата
Наверняка есть решение более актуальное.

Наверняка есть. Только я до него пока не дошел. Причем есть по крайней мере один сайт по такой же тематике. Там ребята размахнулись не по-детски. Уже пару лет как с этим работают. У меня запросы поскромнее - немного другие планы на это, но как знать smile

Автор: korob2001 24.5.2005, 02:32
Цитата

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

smile Я как-то не сталкивался с таким подходом. Ведь время модификации не может вернуть папка smile, его должно возвращать что-то более разумное, наприемер исполняемый файл, ну или сервер. Кстати о папках, если ты видишь в адресной строке такой путь:
http://host.ru/struct/archive/
Это ещё не значит что ты обращаешься к каталогу, просто сервер настроен так, что когда ты указываешь такой путь, то запускается определённый скрипт, который тебе и выдаёт информацию. Это делается как правило, что бы скрыть пути такого вида:
http://host.ru/struct/erchive/archive.pl?id=021242&sid=1245145633&act=show
Причины для такого сокрытия могут быть разные. Вобщем папка не вернёт тебе время обновления архивов, которые находятся в ней.

Или я тебя не допонял или ты не допояснил задачи. smile

Цитата

Хочу сделать что-то вроде сборника прайс-листов. Вернее работа уже идет. Теперь понемногу оптимизирую код.

Т.е. ты грузишь архивы на сервер. Наверное для того, что бы потом можно было их как-то оттуда скачать??? Если да, то ты должен их как-то выводить, например в html код, где юзер может нажать на ссылку и скачать архив. Как правило, это делает программа написанная на серверном языке: Perl, PHP, ASP и т.д. Вот она, при генерации ссылок пусть и узнаёт время последнего обновления архива и выдаёт его на той же странице.
Или я опять не верно понимаю??? smile

Автор: Sadok 24.5.2005, 08:47
Я думаю, wget (возможно curl, не работал с ним) спасет отца русской демократии. Тут же надо анализировать ответы серера (Last-modified, например)

Автор: wladk 24.5.2005, 11:22
Пример из книги
Network Programming with Perl
http://www.modperl.com/perl_networking/

Код

#!/usr/bin/perl
# file: mirror_rfc.pl
# Figure 9.5: Mirror RFCs from www.faqs.org

use strict;
use LWP;

use constant RFCS => 'http://www.faqs.org/rfcs/';

die "Usage: mirror_rfc.pl rfc1 rfc2...\n" unless @ARGV;

my $ua       = LWP::UserAgent->new;
my $newagent = 'mirror_rfc/1.0 (' . $ua->agent .')';
$ua->agent($newagent);

while (defined (my $rfc = shift)) {
  warn "$rfc: invalid RFC number\n" && next unless $rfc =~ /^\d+$/;
  my $filename = "rfc$rfc.html";
  my $url = RFCS . $filename;

  my $response = $ua->mirror($url,$filename);
  print "RFC $rfc: ",$response->message,"\n";
} 


Делает, помоему, то что тебе надо, закачивает документ с сервера на локальную машину, если только документ на серверее имеет более позднюю дату изменения, чем локальный.

Автор: Гость_Alex 24.5.2005, 23:04
Цитата
http://host.ru/struct/archive/

Если указать данный путь, выдается что-то вроде
Name Last modified Size Description
--------------------------------------------------------------------------------
Parent Directory 12-May-2005 06:22 -
f1.htm 18-May-2005 08:00 22k
f10.htm 18-May-2005 08:00 24k
f11.htm 18-May-2005 08:00 24k
.................................................................
Цитата
Т.е. ты грузишь архивы на сервер. Наверное для того, что бы потом можно было их как-то оттуда скачать???

Я гружу их на сервер, потом парсю и оставляю в *.csv формате для запросов пользователей...

На счет последующих советов - большое спасибо, попробую, может что-нибудь да выйдет...
Если нет, еще раз к Вам обращюсь smile

Автор: Гость_Alex 26.5.2005, 18:33
На счет первого совета:
Цитата
Я думаю, wget спасет отца русской демократии

Скорее всего не спасет
Я еще с ним не возился, хотя судя по возможностям (сегодня просмотрел документацию) полезная программка.
Однако есть два нюанса:
1) при проверке обновления он сравнивает дату сохраненного файла и закачиваемго. Таким образом необходимо у себя держать архивы. А их размеры сопоставимы с размерами полученных после обработки *.csv-файлов. Если архивов немного, тогда без разницы, в противном случае.....
2) Т.к. это прайс-листы, то имена архивов бывает, что совпадают (например, price.zip). При этом их придется размещать по разным папкам, а это лиший напряг. Его тоже, в принципе, можо решить, но должно же быть более тривиальное решение!!!
Может, правда, не нашел того, что нужно, но остается надеяться на второй вариант, хотя сходу он не пошел.
Ждите завтра с новыми вопросами либо с положительным результатом smile

Автор: korob2001 27.5.2005, 03:16
При загрузке на сервер, генерируй новое имя архиву, и избавишься от проблемы указанной во втором пункте.

Автор: Гость_Alex 27.5.2005, 06:23
Цитата
При загрузке на сервер, генерируй новое имя архиву

Пробовал еще вчера вечером, но в оношении wget я так и не нашел - позволяет ли он изменять имя файла.
Однако по крайней мере это позволяет сделать приведенный выше перловский код.
Таким образом, в итоге на одну проблему меньше.
Однако другая проблема осталась: при проверке обновления происходит сравнение дат сохраненного файла и закачиваемго. А следовательно, как я выше говорил, удваивается потребляемое пространство, что на определенном этапе все равно потребует решения!!! Как тут ни крути!
Вопрос остался вопросом, хотя кое-какие продвижения все-таки есть smile

Автор: korob2001 27.5.2005, 06:46
Гость_Alex - ну ты и намутил воды. smile
Я нифига не врубаюсь в смысл всего этого.

Вот как я тебя понимаю:
Есть некоторый хост, на который кто-то заливает архивы, так же он ( кто-то ) может проматривать список архивов и скачивать их.

Я тебя правильно понимаю??? Или эти архивы разбросаны по сети???

Автор: Гость_Alex 27.5.2005, 07:06
Эти архивы разбросаны по сети. Я сам их заливаю и обрабатываю. И мне, чтоб лишний раз не заливать, нужно просто проверять время модификации.

Впрочем возможно часть впросов будет снята, если зайти на

http://price.ubd.ru

Правда это первоначальный вариант: для поисковиков более-менее оптимизирован, а до дизайна пока руки не доходят

Автор: korob2001 27.5.2005, 07:50
Извини, краток буду. У меня через 15 минут поезд. Посмотри этот код:
Код

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
my $url  = "http://www.vapk.ru/files/price/price.zip";
my $head = ( head( $url ) )[2];
print "Файл был модифицирован: " . scalar localtime( $head );

Удачи.

Автор: Гость_Alex 27.5.2005, 07:57
Спасибо, сегодня попробую
Сейчас самому собираться надо

Автор: Sadok 27.5.2005, 09:00
Цитата
Пробовал еще вчера вечером, но в оношении wget я так и не нашел - позволяет ли он изменять имя файла.

Код
wget --help
Usage: wget [OPTION]... [URL]...
......
 -O   --output-document=FILE   write documents to FILE.
.....

Автор: Гость_Alex 27.5.2005, 22:38
1)
На счет wget - я немного сглупил. Видел эту опцию, но когда обкатывал программу вместо -О поставил -о, что соответствует записи в логфайл. Долго разбираться не стал, т.к. указанная выше проблема хранения на серваке архивов все равно не решалась, а предложенный в следующем сообщении перловский код, в принципе, делал тоже самое.

2)
Цитата
Посмотри этот код:

Работает!!! Спасибо!!!

Большое спасибо всем за советы!!!
Удачи.

Автор: Гость_Alex 29.5.2005, 06:20
smile
Это опять я.
Ларец оказался с сюрпризами.
Возникла новая проблема, вернее я только что на нее наткнулся
С помощью последнего из приведенных перловских кодов не всегда удается определить время модификации файлов
Вот пару примеров:
1) "http://www.voil.ru/price.zip"
2) не удается получить время модификации php-шных файлов, хотя можно визуально увидеть это время, если указать строке адреса браузера путь папки, в которой они лежат (за исключением корневого каталога)

Вторая проблема меня, в принципе, не интересует. Ее привел для полноты картины. Возможно они как-то связаны.
А как быть с первой???

Автор: korob2001 29.5.2005, 09:47
Просто таким кодом мы обрабатываем заголовок, который нам возвращает сервер на запрос. Некоторые сервера не делают этого. smile Потому придётся такие архивы грузить и проверять дату последнего изменения локально.

Автор: Гость_Alex 29.5.2005, 12:10
Цитата
Просто таким кодом мы обрабатываем заголовок, который нам возвращает сервер на запрос

Это я понял, как только ты выслал мне код. За него еще раз спасибо, он мне здорово помог!
Цитата
Некоторые сервера не делают этого

Может быть и так, а может и не совсем:
1)
Например, у меня есть файл - "http://price.ubd.ru/raznoe/firmi.php"
Если подставить этот URL в тот код, то мы ничего не получим, хотя, если указать адрес папки, где лежит файл "firmi.php", то можно увидеть время модификации...
Возможно это из-за php-шного расширения
2)
В отношении "http://www.voil.ru/price.zip"???
Где подколка не знаю. Здесь есть один нюанс, который я не совсем хорошо познал, поэтому пока сваливаю на него-это автоматическая переадресация (возможно реализованная разработчиком). Так, например, ели указать "http://www.voil.ru/html/", меня автоматически выбрасывает на главную страницу.
Возможно высказанное предположение - полный бред, но пока я в этом не разобрался, такой вариант остается...

Еще немного повожусь. Если не получится, оставлю до лучших времен. Благо таких подводных камней немного smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)