【问题标题】:Most efficient way to serve files through a PHP server from Google Cloud Storage?通过 Google Cloud Storage 中的 PHP 服务器提供文件的最有效方式?
【发布时间】:2021-10-16 01:48:31
【问题描述】:

我有一个简单的图像处理服务器来处理图像的身份验证、调整大小、裁剪等。 如果它最近做了一个相对较大的操作,例如调整图像大小,它会将调整后的新版本上传回 Cloud Storage,下次再次需要精确大小时会使用它。

我的问题是,下次有人请求该图像,或者服务器“直接”从 Google Cloud Storage 存储桶中提供未更改的图像时,我的 PHP 服务器“传递”图像数据的最佳方法是什么给用户,使用尽可能少的处理和内存?

现在我当前的工作代码归结为:

if ($image->exists()) {
    header("Content-Type: image/jpeg");
    echo $image->downloadAsString();
}

从外观上看,这似乎是一种糟糕的做事方式。但我不知道,所以我问。

编辑: 我不是在寻找最有效的方式来为客户提供一般或任何更大的方案中的图像,我正在寻找我可以在 PHP 中使用的最有效的函数来完成我想要做的事情尽可能少的延迟、CPU 使用率和内存。

“我正在尝试做的事情”是:在运行的 PHP 脚本中,验证用户是否可以访问图像,检查调整大小的图像是否存在,如果存在,将其中继到客户端。如果没有,请调整图像大小,将其发送回云存储以供以后检索,然后将调整大小的图像发送给用户。我现在唯一关心的部分是如何将数据从存储桶传递给用户。

假设包括存储桶本身在内的所有服务器都在同一个区域中。我没有使用框架。我需要通过网络服务器提供服务,对于那些我不需要的服务,我使用负载均衡器直接从云存储提供服务。我没有使用 CDN。

【问题讨论】:

  • 用更多细节编辑您的问题。 1)你使用的是Laravel之类的框架吗? 2) 存储在 Google Cloud Storage 中的对象是否公开? 3) 您是否需要通过 Web 服务器提供文件,或者您可以使用公共访问或签名 URL 直接从 Cloud Storage 服务对象? 4) 你在使用 CDN 吗? 5)根据您问题中的信息,很难确定最有效。一般来说,考虑到成本和延迟,最有效的方法是将对象直接从 Cloud Storage 提供给客户端。

标签: php google-cloud-storage


【解决方案1】:

使用downloadAsStream()stream_copy_to_stream() 应该会给你最好的结果。例如:

if ($image->exists()) {
    header("Content-Type: image/jpeg");
    stream_copy_to_stream($image->downloadAsStream(), STDOUT);
}

在这种情况下,PHP 应该将文件数据直接复制到输出,因为它以最大的效率、内存或其他方式检索。

如果您在源 downloadAsString() 中向上滚动一点,只需调用流并将整个内容作为字符串返回,这会将所有文件数据填充到内存中。

此外,为了获得最佳效果,请获取 StorageObject 元数据并设置 Content-Length: 标头。这通常会使 HTTP 客户端表现得更好一些。我相信这将在$image->info() 返回的内容中。

【讨论】:

  • 此答案未考虑网络定价、延迟、对象缓存或如何从 Google Cloud Storage 交付对象的问题。这个答案只考虑优化内存中的数据传输。从 VM 网络服务器提供对象比从 Cloud Storage 提供对象更昂贵。
  • @JohnHanley 一定要写下你自己的答案,并为接受的答案不再被固定在顶部而感到高兴。
  • 我向 OP 询问了更多细节,以便可以创建一个好的答案。您的回答没有错,但恕我直言,应该考虑更多细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多