1

我想运行 files.list 以获取用户驱动器上的文件列表,然后并行运行 files.get 以下载文件。问题是,当并行操作之前是对 API 的单个请求(files.list 或 files.get)时,Google 客户端会因 /vendor/guzzlehttp/guzzle/src/Handler/CurlFactory 中的“不支持的操作数类型”而中断.php 第 140 行。

我正在使用官方的 Google PHP 客户端Amphp 的 parallelMap()

我的代码如下所示:

function __construct($token, $refresh_token)
{
    $google_client = new \Google_Client();
    // ...........
    $this->api = new \Google_Service_Drive($google_client);
}


public function downloadFile($remote_file_id)
{
    $file = $this->api->files->get($remote_file_id, ['alt' => 'media']);
    return $file->getBody()->getContents();
}


public function downloadFiles($files_ids)
{
    $download_jobs = parallelMap($files_ids, function ($file_id) {
        return $this->downloadFile($file_id);
    });

    return wait($download_jobs);
}

// $storage = new Storage(..., ...);

$files1 = [
    0 => "1s9aaHl8UsTswPMsXAt6X_ooDY0idv27dfSR4ysWBI5J2KSuvqw",
    1 => "1ZKQmozeA9TfUDp5dTs7CDuRcuesBhkK_iUe4XG3L1nE9ySRz6Q",
    2 => "12kGcMS_l58cGJWvdOyQRLqwbbWhTHeA_OBuVITbeMcN0V0PnPA",
    3 => "1ETVMmfno_DUn7KloyUpzukOFlt0QcinqZ0C2pRgff-osIHyf-Q",
    4 => "1P6CIe7A8qsgLLHf3AZn0Gj4YsTHPsGIZRok0_Pke60QeAXGoMg",
    5 => "1d8K7WvDqT40b1MGIDWMxK010invlmaX4e6qdc2pui7TV3Z4liQ",
 ];

 $downloaded = $storage->downloadFile($files1[0]); // if uncommented, this causes downloadFiles to break
 $downloaded = $storage->downloadFiles($files1);

似乎第一个请求在 Google 客户端内部做了一些事情,然后并行请求停止工作。如果我只运行 downloadFiles(),它运行顺利。即使这样也有效:

    $files = [];
    $files[] = $storage->downloadFiles([$files1[0]]);
    $files[] = $storage->downloadFiles([$files1[1]]);
    $files[] = $storage->downloadFiles([$files1[2]]);
    $files[] = $storage->downloadFiles([$files1[3]]);
  1. 为什么 Google 客户端库在并行运行时会中断?
  2. 在 PHP+Laravel 上并行运行 Drive 下载的最佳实践是什么?我遵循 Google 的最佳实践,分别处理它们的异常和每个错误代码。

我正在运行 PHP 7.2.11

4

0 回答 0