Как правильно скачивать картинки с помощью curl php

Валентин Жуков

Здавствуйте, есть такая задача,- необходимо скачать множество картинок с сервера, но так, как картинок много скрипту не хватает времени на выполнение. Пробовал скачивать с помощью мульти курл, но тут тоже косяк, бывает что картинка не полностью скачивается и сохраняется в не читаемом виде. Функция file_get_contents работает быстрее чем curl, но мне нужно еще получать размер изображения и подключаться по фтп, поэтому для меня тоже не подходит. На данный момент скачивание изображений у меня реализовано так;

  1. подготавливаю список изображений и сохраняю в файлике
  2. начинаю скачивать, перезаписываю файлик - удаляя из него скаченное изображение

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

3 ответа

Валентин Жуков

Я использовал такую конструкцию:

if (preg_match("/http/",$url_files)){ $ch = curl_init($url_files); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); $out = curl_exec($ch); $image_sv = 'путь_куда_вы_сохраняете_картинку'.$nm.'.jpg'; $img_sc = file_put_contents($image_sv, $out); curl_close($ch);
}


Валентин Жуков

Существует еще такой метод. Это подобие того, как вам ответил ggLike

function grab_image($url,$saveto){ $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); $raw=curl_exec($ch); curl_close ($ch); if(file_exists($saveto)){ unlink($saveto); } $fp = fopen($saveto,'x'); fwrite($fp, $raw); fclose($fp);
}


Валентин Жуков

Можно воспользоваться библиотекой mcurl

use MCurl\Client;
$urls = array( 'ht tp://cs1-38v4.vk-cdn.net/p13/cdfeaeaf00705d.mp3', 'ht tp://cs1-32v4.vk-cdn.net/p2/5c0972b283ee17.mp3',
);
$save_path = '/tmp';
$client = new Client();
do { while ($client->has()) { $result = $client->next(); // Пересохраняем рисунок с ошибкой if ($result->hasError()) { $urls[] = $result->options[CURLOPT_URL]; } } foreach($urls as $url) { $file = $save_path . '/'. basename($url); $client->add([ CURLOPT_URL => $url, CURLOPT_FILE => fopen($file, 'w'), ]); } $urls = [];
} while($client->run() || $client->has());

licensed under cc by-sa 3.0 with attribution.