@webpixel

Как реализовать так называемую chunked выгрузку файлов на удаленный сервис при помощи PHP CURL?

Приветствую, знатоки! Постоянно сталкиваюсь с такой ситуацией: при выгрузке файлов через браузер, скорость обычно в 3-5 раз больше, чем через скрипт написанный для автоматизации, при помощи PHP CURL. Нашел несколько примеров решения данной задачи на других языках, путем разбивания файла на 8-10 кусков (chunk) и их параллельной выгрузки. Интересует, как это реализовать на PHP. Подскажите пожалуйста. Будут полезны и интересны любые реализации, можно при помощи Guzzle и схожих библиотек.

Пример моего скрипта:
<?php

$file = 'sashaGrey.avi';

function zippyShare(string $file)
{
    $ping = slapCurl('https://www.zippyshare.com/');

    preg_match('/name="uploadId" value="(.*?)"/', $ping, $uploadId);
    preg_match('@http://.+\.zippyshare\.com/upload@', $ping, $server);

    $params = [
        'uploadId' => $uploadId[1],
        'file_0'   => curl_file_create($file)
    ];

    $uploadFile = slapCurl($server[0], $params, true);

    if (preg_match('#\[url=(.*?)\]#', $uploadFile, $match)) {
        return trim($match[1]);
    }
}

function slapCurl(string $url, array $data = null, bool $progress = false)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    if (!is_null($data)) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if ($progress) {
        curl_setopt($ch, CURLOPT_NOPROGRESS, false);
    }

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}

$result = zippyShare($file);

var_dump($result);


Спасибо!
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
оттрейси Fiddler ом и соблюди все загловки + чексуммы, там ничего сложного - нужно кропотливо воспроизвести заголовки

на httpbin можно проверять
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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