Download файлов
[это можно не читать]
Сейчас в меня полетят камни мол как можно задавать такие тривиальные вопросы ... но видимо без пинка в нужном направлении разобраться не смогу. Задача простая, есть ОООООчень много небольших файлов на серверах, поскольку это облачное хранилище то доступ к ним логичнее осуществлять через банальный http. Мне нужно написать скрипт для их скачивания(для бекапа). [/это можно не читать] Итого имеется куча http адресов файлов, их нужно скачать. Проблема заключается в том, что я не представляю как опеределить что файл закачан полностью? Чтобы отрубания сервера, или проблемы с интернетом и т.п. не влияли на файлы, и недокаченные файлы качались заново. А, ну да, пишется это всё на PHP. Заранее спасибо. |
обычно целостность определяют по контрольной сумме (md5) файла.
проблема только в том, чтобы высчитать 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). А при проблемах со связью он не может дважды выдать файл одинаково неполный. |
хм.. на сервере нельзя это высчитывать? это бы помогло избежать этой трудности.
|
Цитата:
Иными словами не подходит для моей конкретной задачи, поэтому ограничиваюсь http запросами. |
чтобы сравнить, правильно ли скачен файл, ничего по сути о нём не зная, необходимо знать путь файла (откуда скачивать) и достоверность о том, что он скачен верно (вот тут загвоздка). последнее можно определить по проверке их md5, либо проверке их размеров.
вам придётся скачивать файл по три раза, чтобы убедиться в правильности скачки. |
melky,
видимо я Вас не до конца понимаю. Разве функция которую я написал выше не дает достаточную уверенность что файл скачан верно? Ну и тогда файл получается мы скачиваем 2 раза по http, и 1 раз локально проверяя md5. Или я что-то упустил? |
да нет, всё верно. а если результаты отличаются (1 и 2), то как вы опознаете, какой файл скачен верно? придётся скачивать ещё раз.
|
Цитата:
Спасибо! |
При ответе на запрос веб-сервер обычно отправляет в ответе заголовок Content-Length. Вот и сверяйте размер файла с ним.
|
B@rmaley.e><e,
Примерно так? function safe_copy($source_file, $destination_file) { if(!$aHeaders=@get_headers($source_file, 1)) return false; if(!$iSize1=$aHeaders['Content-Length']) return false; if(!@copy($source_file, $destination_file)) return false; if(!$iSize2=@filesize($destination_file)) return false; if($iSize1!=$iSize2) return false; return true; } |
Да.
|
function curl_download( $url, $file ) { // открываем файл, на сервере, на запись $dest_file = @fopen( $file, "w" ); // открываем cURL-сессию $resource = curl_init(); // устанавливаем опцию удаленного файла curl_setopt( $resource, CURLOPT_URL, $url ); // устанавливаем место на сервере, куда будет скопирован удаленной файл curl_setopt( $resource, CURLOPT_FILE, $dest_file ); // заголовки нам не нужны curl_setopt( $resource, CURLOPT_HEADER, 0 ); // выполняем операцию curl_exec( $resource ); $error = curl_errno( $resource ); // закрываем cURL-сессию curl_close( $resource ); // закрываем файл fclose( $dest_file ); return $error; } |
devote, разве CURL сможет понять, когда связь оборвалась, а когда файл скачан верно \ неверно ?
|
Цитата:
|
Цитата:
|
да и функции типа md5_file и copy должны возвращать ошибки. Вообще непонятно, откуда взялись идеи о том, что файл может неправильно скачаться. TCP стал ненадежным протоколом?
Цитата:
|
Цитата:
Цитата:
1. при этом на авторизацию и прочие "движняки" потребляется куда больше трафика - следовательно затрачивается значительно времени. 2. для авторизаций и прочих "движняков" требуется затрачивается также исходящая скорость(в смысле в большем объеме чем при загрузке по http). Это я проверял, потребление исходящего трафика там достаточно большое(это некая особенность API). А у меня входящий трафик 8Мбит, исходящая 0,5Мбит. Следовательно все варианты с затратой исходящего трафика мне не подходят. Если помножить 1 и 2 пункты на миллины мелких файлов, то получается что каждая сотая секунды "на счету". Пока удалось добиться загрузки со скоростью порядка 1 секунды на файл, позже подумаю как увеличить скорость за счет многопоточного Curl. Цитата:
|
Цитата:
|
Цитата:
|
в первую очередь TCP "вернет" false, а потом и функция copy должна вернуть FALSE.
|
x-yuri,
спасибо! |
Часовой пояс GMT +3, время: 18:58. |