Сделал рабочий скрипт, если кому интересно:
<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors','1');
function grab_image($url, $saveto){
if (file_exists($saveto)){
unlink($saveto);
}
$fp = fopen($saveto, 'w+b');
if (false === $fp) {
throw new RuntimeException ( 'fopen() failed. last error: ' . return_var_dump ( error_get_last () ) );
}
$ch = curl_init($url);
if (false === $ch) {
throw new RuntimeException ( 'curl_init() failed. last error: ' . return_var_dump ( error_get_last () ) );
}
ecurl_setopt($ch, CURLOPT_URL, $url);
ecurl_setopt($ch, CURLOPT_FILE, $fp);
ecurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
ecurl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
ecurl_setopt($ch, CURLOPT_TIMEOUT, 30);
ecurl_setopt($ch, CURLOPT_VERBOSE, 1);
ecurl_setopt($ch, CURLOPT_STDERR, $fp);
ecurl_exec($ch);
curl_close($ch);
fclose($fp);
}
$file = file_get_contents('images.txt');
$images = explode("\n", $file);
$i = 0;
foreach ($images as $image) {
$i++;
$image = str_replace(" ","%20", trim($image));
echo "image number: " .$i. "<br>";
$fileName = explode('/', $image);
end($fileName);
$key = key($fileName);
$fp = 'images/'.$fileName[$key];
grab_image($image, $fp);
}
function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
$ret=curl_setopt($ch,$option,$value);
if($ret!==true){
//option should be obvious by stack trace
throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
}
return true;
}
function ecurl_exec ( /*resource*/$ch)/*:mixed depending on CURLOPT_RETURNTRANSFER*/{
$ret=curl_exec($ch);
if($ret===false){
throw new RuntimeException ( 'curl_exec() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
}
return $ret;
}
function return_var_dump(/*...*/){
$args = func_get_args ();
ob_start ();
call_user_func_array ( 'var_dump', $args );
return ob_get_clean ();
}
Ссылки на картинки находятся в txt файле, каждая ссылка на новой строке.