26.01.2012, 19:23
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
Download файлов
[это можно не читать]
Сейчас в меня полетят камни мол как можно задавать такие тривиальные вопросы ... но видимо без пинка в нужном направлении разобраться не смогу.
Задача простая, есть ОООООчень много небольших файлов на серверах, поскольку это облачное хранилище то доступ к ним логичнее осуществлять через банальный http. Мне нужно написать скрипт для их скачивания(для бекапа).
[/это можно не читать]
Итого имеется куча http адресов файлов, их нужно скачать. Проблема заключается в том, что я не представляю как опеределить что файл закачан полностью? Чтобы отрубания сервера, или проблемы с интернетом и т.п. не влияли на файлы, и недокаченные файлы качались заново. А, ну да, пишется это всё на PHP.
Заранее спасибо.
|
|
26.01.2012, 20:24
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
обычно целостность определяют по контрольной сумме (md5) файла.
проблема только в том, чтобы высчитать md5 для файла в источнике.
|
|
26.01.2012, 21:29
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
Сообщение от melky
|
проблема только в том, чтобы высчитать md5 для файла в источнике
|
вот и я думаю как это сделать... ведь если мы просто считаем этот файл, то нет гарантии что нам файл выдался до конца, и не произошло обрывов связи. Хотя если подумать то наверное что-то вроде этого должно стабильно работать:
function safe_copy($source_file, $destination_file) {
if(!$sMD5_step1=@md5_file($source_file)) return false;
if(!@copy($source_file, $destination_file)) return false;
if(!$sMD5_step2=@md5_file($destination_file)) return false;
if($sMD5_step1!==$sMD5_step2) return false;
return true;
}
Как я понимаю, тут получилась двойная проверка, т.к. по сути здесь 2 запроса на сервер: md5_file($source_file) и copy($source_file, $destination_file). А при проблемах со связью он не может дважды выдать файл одинаково неполный.
Последний раз редактировалось greatilya, 26.01.2012 в 21:32.
|
|
26.01.2012, 22:02
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
хм.. на сервере нельзя это высчитывать? это бы помогло избежать этой трудности.
|
|
26.01.2012, 22:20
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
Сообщение от melky
|
на сервере нельзя это высчитывать? это бы помогло избежать этой трудности.
|
нет, там конечно можно получать доступ через API, там и должны быть md5 хеши, но при работе через API время работы скрипта значительно увеличивается, причем трафик тоже значительно больше потребляется.
Иными словами не подходит для моей конкретной задачи, поэтому ограничиваюсь http запросами.
|
|
26.01.2012, 22:25
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
чтобы сравнить, правильно ли скачен файл, ничего по сути о нём не зная, необходимо знать путь файла (откуда скачивать) и достоверность о том, что он скачен верно (вот тут загвоздка). последнее можно определить по проверке их md5, либо проверке их размеров.
вам придётся скачивать файл по три раза, чтобы убедиться в правильности скачки.
|
|
26.01.2012, 22:40
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
melky,
видимо я Вас не до конца понимаю. Разве функция которую я написал выше не дает достаточную уверенность что файл скачан верно? Ну и тогда файл получается мы скачиваем 2 раза по http, и 1 раз локально проверяя md5. Или я что-то упустил?
|
|
26.01.2012, 22:58
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
да нет, всё верно. а если результаты отличаются (1 и 2), то как вы опознаете, какой файл скачен верно? придётся скачивать ещё раз.
|
|
26.01.2012, 23:10
|
|
Интернет-турист
|
|
Регистрация: 01.08.2008
Сообщений: 516
|
|
Сообщение от melky
|
да нет, всё верно. а если результаты отличаются (1 и 2), то как вы опознаете, какой файл скачен верно? придётся скачивать ещё раз.
|
а тут на мой взгляд уже не важно. Если функция вернула FALSE, значит файл скачать не удалось, и нужно попробовать скачать заново но позже. Поскольку данная ситуация будет возникать крайне редко, то тут можно обычную обработку с очередью заданий на скачивание. Иными словами это уже "дело техники", реализаций придумать можно много.
Спасибо!
|
|
26.01.2012, 23:48
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
При ответе на запрос веб-сервер обычно отправляет в ответе заголовок Content-Length. Вот и сверяйте размер файла с ним.
|
|
|
|