Как правильно скачать БОЛЬШОЙ файл по ссылке используя Laravel 5?

Добрый день
Собственно вопрос в заголовке, добавлю лишь небольшие уточнения
"Большой файл" -от 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;
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы