Добрый день
Собственно вопрос в заголовке, добавлю лишь небольшие уточнения
"Большой файл" -от 40мб до 2гб примерно
Скачивать нужно в автоматическом режиме - т.е. есть список урлов из пары тысяч строк, и нужно все эти пару тысяч файлов выкачать в фоновом режиме
Сейчас этим занимается самописная качалка на cURL
Но хотелось бы сделать именно Laravel-style (5.5)
Я понимаю что нужно ставить очередь \ фоновое исполнение- это не вопрос
Вопрос именно в самом методе который отвечает за скачивание
Сейчас качалка выглядит примерно вот так:
$url=str_replace(" ","%20",$url);
$ch = curl_init ($url);
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_NOBODY, 1);curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)');
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
$ret=curl_exec ($ch);curl_close ($ch);
preg_match_all('|.*Content-Length: (\d+)|',$ret,$mt);
$sz=$mt[1][count($mt[1])-1];
$path.=$file_name;
if($sz<1000){ echo($ret."\nFAIL:$url\n"); return false;}
if($getsize)return $sz;
$chunksize=round($sz/$threads);
for($ci=0;$ci<($threads-1);$ci++){
$range=$ci*$chunksize."-".(($ci+1)*$chunksize-1);
$cfn=$path.".c".($ci+1);
$cmd="curl --range $range --retry 3 --retry-delay 3 --location --referer \"$ref\" --user-agent \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)\" --output \"$cfn\" \"$url\"";
if($config['os']=="linux"){
exec($cmd." 1>/dev/null 2>&1 &");
}
if($config['os']=="windows"){
pclose(popen("start ".$this->flag." \"Window_name\" ".$cmd." > nul 2>nul ", "r"));
}
usleep(100000);
}
$range=$ci*$chunksize."-";
$cfn=$path.".c".($ci+1);
$cmd="curl --range $range --retry 3 --retry-delay 3 --location --referer \"$ref\" --user-agent \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)\" --output \"$cfn\" \"$url\"";
if($config['os']=="linux"){
exec($cmd." 1>/dev/null 2>&1 &");
}
if($config['os']=="windows"){
pclose(popen("start ".$this->flag." \"Window_name\" ".$cmd." > nul 2>nul ", "r"));
}
do{
clearstatcache();
unset($co);
if($config['os']=="linux"){
exec("ps -f|grep [c]url|grep '$path'",$co);
}
if($config['os']=="windows"){
exec("tasklist /FI \"IMAGENAME eq curl.exe\" ",$co);
}
$ni=count($co)-3;
if($ni<1)break;
sleep(1);
}while(1);
$final=fopen($path,"wb+");
for($ci=0;$ci<$threads;$ci++){
$cfh=fopen($path.".c".($ci+1),"r+");
while(!feof($cfh)){
$t=fread($cfh,1048576);
if(!$t)break;
fwrite($final,$t);
}
fclose($cfh);
@unlink($path.".c".($ci+1));
}
fclose($final);
clearstatcache();
if($sz!=@filesize($path))$sz=0;