使用 Google App Engine php55 或 php7 将任意大文件下载到云存储的解决方案是什么?

What is solution for downloading arbitrarily large files to Cloud Storage using Google App Engine php55 or php7?

我有一个 google 应用程序引擎 php55 服务,它会定期检查 public 网站并下载文件。此文件通常很小 (<1MB)。我的简单应用程序基于以下内容:

<?php
$strSource = 'https://example.com/file.zip';

$strBucket = 'bucket-1234';
$strDirectory = '/path/to/file/'; // Google Cloud Storage directory
$strName = 'file.zip';
$strDestination = 'gs://' . $strBucket . '.appspot.com' . $strDirectory . $strName;

copy($strSource,$strDestination);
?>

我发现这个文件偶尔会更大(超过 32MB response size limit)。我该如何编写这个脚本来处理文件,无论是 1MB 还是 100MB?

我看到有人推荐“Blobstore," which is something I do not have experience with. Even if I understood that solution (which seems to be focused on a very different use case),它似乎根本不适用于 PHP。我错过了什么吗?

我建议您使用 Compute Engine 实例,因为 GAE 对响应大小有 32MB 的限制。 我发现 ,用户检查是否有可用的新文件,如果有,他直接上传到 GCS。

为了做到这一点,并且在 documentation, you should create an instance in GCE,and install and configure the client library 中指定了您将要使用的语言(正如您在 post 中提到的那样,您正在使用 PHP ,所有链接都将引用该语言,但请记住,您也可以选择其他语言,如 C++,Java、Python...)。

您可以在 PHP 中找到有关如何 upload an object to GCS:

的示例
function upload_object($bucketName, $objectName, $source)
{
    $storage = new StorageClient();
    $file = fopen($source, 'r');
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->upload($file, [
        'name' => $objectName
    ]);
    printf('Uploaded %s to gs://%s/%s' . PHP_EOL, basename($source), $bucketName, $objectName);
}

您还可以在 Google Cloud Platform 的 Github repository 中找到其他示例。

希望对您有所帮助!

使用Google Storage Transfer Service (STS)。它可以从现有 App Engine 应用程序的 Google Cloud SDK 调用,并将文件直接从 S3 传输到 GCS,而不会达到任何 App Engine 限制。根据您的描述,我认为它符合您的要求:

  • 无数据传输限制
  • 最少的代码更改
  • "Serverless" 并且配置简单

STS 有一些额外的好处:

  • Zero runtime cost。也就是说,App Engine 只是调用 STS API 来启动由 STS 处理的传输作业,因此您无需为 GAE 通常用于 download/upload 文件本身的时间付费。
  • 通过从 Cloud Scheduler 触发的 Cloud Functions 调用 STS,您甚至可以 更加无服务器 。我怀疑你会节省很多成本,但它肯定会是一个整洁的设置。

GCP 文档有关于 How to set up a Transfer from Amazon S3 to Cloud Storage 的指南。


补充说明: