Azure和Flysystem中异步客户端的HTTP并行进程

Azure和Flysystem中异步客户端的HTTP并行进程,azure,guzzle,progress,transfer,flysystem,Azure,Guzzle,Progress,Transfer,Flysystem,我想得到实际的区块进度,而不是所有转移的进度。目前我不知道如何检测每个单独传输的blockId。关于im当前检索的进度回调的信息毫无意义 下面是包含在ServiceRestProxy.php中的progress函数 原函数 我找到了一个解决方案,可以让每个街区都进展顺利 我需要为此使用异步函数。更新版本 /** * Send the requests concurrently. Number of concurrency can be modified * by inserting a ne

我想得到实际的区块进度,而不是所有转移的进度。目前我不知道如何检测每个单独传输的blockId。关于im当前检索的进度回调的信息毫无意义

下面是包含在ServiceRestProxy.php中的progress函数

原函数


我找到了一个解决方案,可以让每个街区都进展顺利

我需要为此使用异步函数。更新版本

/**
 * Send the requests concurrently. Number of concurrency can be modified
 * by inserting a new key/value pair with the key 'number_of_concurrency'
 * into the $requestOptions of $serviceOptions. Return only the promise.
 *
 * @param  callable       $generator   the generator function to generate
 *                                     request upon fulfillment
 * @param  int            $statusCode  The expected status code for each of the
 *                                     request generated by generator.
 * @param  ServiceOptions $options     The service options for the concurrent
 *                                     requests.
 *
 * @return \GuzzleHttp\Promise\Promise|\GuzzleHttp\Promise\PromiseInterface
 */
protected function sendConcurrentAsync(
    callable $generator,
    $statusCode,
    ServiceOptions $options
) {
    $client = $this->client;
    $middlewareStack = $this->createMiddlewareStack($options);

    $progress = [];

    $sendAsync = function ($request, $options) use ($client, $progress) {
        if ($request->getMethod() == 'HEAD') {
            $options['decode_content'] = false;
        }

        $options["progress"] = function(
                $downloadTotal,
                $downloadedBytes,
                $uploadTotal,
                $uploadedBytes) use($request, $progress){
            // extract blockid from url
            $url = $request->getUri()->getQuery();
            parse_str($url, $array);

            // this array can be written to file or session etc
            $progress[$array["blockid"]] = ["download_total" => $downloadTotal, "downloaded_bytes" => $downloadedBytes, "upload_total" => $uploadTotal, "uploaded_bytes" => $uploadedBytes];

            };
        return $client->sendAsync($request, $options);
    };

    $handler = $middlewareStack->apply($sendAsync);

    $requestOptions = $this->generateRequestOptions($options, $handler);

    $promises = \call_user_func(
        function () use (
            $generator,
            $handler,
            $requestOptions
        ) {
            while (is_callable($generator) && ($request = $generator())) {
                yield \call_user_func($handler, $request, $requestOptions);
            }
        }
    );

    $eachPromise = new EachPromise($promises, [
        'concurrency' => $options->getNumberOfConcurrency(),
        'fulfilled' => function ($response, $index) use ($statusCode) {
            //the promise is fulfilled, evaluate the response
            self::throwIfError(
                $response,
                $statusCode
            );
        },
        'rejected' => function ($reason, $index) {
            //Still rejected even if the retry logic has been applied.
            //Throwing exception.
            throw $reason;
        }
    ]);

    return $eachPromise->promise();
}
/**
 * Send the requests concurrently. Number of concurrency can be modified
 * by inserting a new key/value pair with the key 'number_of_concurrency'
 * into the $requestOptions of $serviceOptions. Return only the promise.
 *
 * @param  callable       $generator   the generator function to generate
 *                                     request upon fulfillment
 * @param  int            $statusCode  The expected status code for each of the
 *                                     request generated by generator.
 * @param  ServiceOptions $options     The service options for the concurrent
 *                                     requests.
 *
 * @return \GuzzleHttp\Promise\Promise|\GuzzleHttp\Promise\PromiseInterface
 */
protected function sendConcurrentAsync(
    callable $generator,
    $statusCode,
    ServiceOptions $options
) {
    $client = $this->client;
    $middlewareStack = $this->createMiddlewareStack($options);

    $progress = [];

    $sendAsync = function ($request, $options) use ($client, $progress) {
        if ($request->getMethod() == 'HEAD') {
            $options['decode_content'] = false;
        }

        $options["progress"] = function(
                $downloadTotal,
                $downloadedBytes,
                $uploadTotal,
                $uploadedBytes) use($request, $progress){
            // extract blockid from url
            $url = $request->getUri()->getQuery();
            parse_str($url, $array);

            // this array can be written to file or session etc
            $progress[$array["blockid"]] = ["download_total" => $downloadTotal, "downloaded_bytes" => $downloadedBytes, "upload_total" => $uploadTotal, "uploaded_bytes" => $uploadedBytes];

            };
        return $client->sendAsync($request, $options);
    };

    $handler = $middlewareStack->apply($sendAsync);

    $requestOptions = $this->generateRequestOptions($options, $handler);

    $promises = \call_user_func(
        function () use (
            $generator,
            $handler,
            $requestOptions
        ) {
            while (is_callable($generator) && ($request = $generator())) {
                yield \call_user_func($handler, $request, $requestOptions);
            }
        }
    );

    $eachPromise = new EachPromise($promises, [
        'concurrency' => $options->getNumberOfConcurrency(),
        'fulfilled' => function ($response, $index) use ($statusCode) {
            //the promise is fulfilled, evaluate the response
            self::throwIfError(
                $response,
                $statusCode
            );
        },
        'rejected' => function ($reason, $index) {
            //Still rejected even if the retry logic has been applied.
            //Throwing exception.
            throw $reason;
        }
    ]);

    return $eachPromise->promise();
}