通过来自 Google 云存储的 PHP 服务器提供文件的最有效方式?
Most efficient way to serve files through a PHP server from Google Cloud Storage?
我有一个简单的图像处理服务器,可以处理图像的身份验证、调整大小、裁剪等。
如果它最近做了一个相对较大的操作,例如调整图像大小,它会将新调整大小的版本上传回 Cloud Storage,下次再次需要精确尺寸时它将使用它。
我的问题是,下次有人请求该图像,或者服务器“直接”从 Google Cloud Storage 存储桶提供未更改的图像时,我的 PHP 服务器的最佳方法是什么使用尽可能少的处理和内存将图像数据“传递”给用户?
现在我当前的工作代码归结为:
if ($image->exists()) {
header("Content-Type: image/jpeg");
echo $image->downloadAsString();
}
从表面上看,这似乎是一种糟糕的做事方式。但是我不知道所以我问。
编辑:
我不是在寻找一般或任何更大的方案向客户端提供图像的最有效方式,我正在寻找我已经可以在 PHP 中使用的最有效的功能来完成我正在做的事情尝试尽可能减少延迟、CPU 使用和内存。
“我正在尝试做的事情”是:在 运行 PHP 脚本中,验证用户是否可以访问图像,检查调整大小后的图像是否存在,以及是否存在,转发给客户端。如果没有,则调整图像大小,将其发送回云存储以供以后检索,然后将调整大小后的图像发送给用户。我现在唯一关心的是如何将数据从存储桶传递给用户。
假设包括桶本身在内的所有服务器都在同一区域中。我没有使用框架。我需要通过网络服务器提供服务,对于那些我不需要的,我使用负载均衡器直接从云存储提供服务。我没有使用 CDN。
使用 downloadAsStream()
and stream_copy_to_stream()
应该会给您最好的结果。例如:
if ($image->exists()) {
header("Content-Type: image/jpeg");
stream_copy_to_stream($image->downloadAsStream(), STDOUT);
}
在这种情况下,PHP 应该将文件数据直接复制到输出,因为它以最大效率、内存或其他方式检索。
如果您在源中向上滚动一点 downloadAsString()
只需调用流和 returns 将整个内容作为一个字符串,这会将所有文件数据填充到内存中。
此外,为了获得最佳结果,获取 StorageObject 元数据并设置 Content-Length:
header。这通常会使 HTTP 客户端表现得更好一些。我相信这将在 $image->info()
.
返回的内容中
我有一个简单的图像处理服务器,可以处理图像的身份验证、调整大小、裁剪等。 如果它最近做了一个相对较大的操作,例如调整图像大小,它会将新调整大小的版本上传回 Cloud Storage,下次再次需要精确尺寸时它将使用它。
我的问题是,下次有人请求该图像,或者服务器“直接”从 Google Cloud Storage 存储桶提供未更改的图像时,我的 PHP 服务器的最佳方法是什么使用尽可能少的处理和内存将图像数据“传递”给用户?
现在我当前的工作代码归结为:
if ($image->exists()) {
header("Content-Type: image/jpeg");
echo $image->downloadAsString();
}
从表面上看,这似乎是一种糟糕的做事方式。但是我不知道所以我问。
编辑: 我不是在寻找一般或任何更大的方案向客户端提供图像的最有效方式,我正在寻找我已经可以在 PHP 中使用的最有效的功能来完成我正在做的事情尝试尽可能减少延迟、CPU 使用和内存。
“我正在尝试做的事情”是:在 运行 PHP 脚本中,验证用户是否可以访问图像,检查调整大小后的图像是否存在,以及是否存在,转发给客户端。如果没有,则调整图像大小,将其发送回云存储以供以后检索,然后将调整大小后的图像发送给用户。我现在唯一关心的是如何将数据从存储桶传递给用户。
假设包括桶本身在内的所有服务器都在同一区域中。我没有使用框架。我需要通过网络服务器提供服务,对于那些我不需要的,我使用负载均衡器直接从云存储提供服务。我没有使用 CDN。
使用 downloadAsStream()
and stream_copy_to_stream()
应该会给您最好的结果。例如:
if ($image->exists()) {
header("Content-Type: image/jpeg");
stream_copy_to_stream($image->downloadAsStream(), STDOUT);
}
在这种情况下,PHP 应该将文件数据直接复制到输出,因为它以最大效率、内存或其他方式检索。
如果您在源中向上滚动一点 downloadAsString()
只需调用流和 returns 将整个内容作为一个字符串,这会将所有文件数据填充到内存中。
此外,为了获得最佳结果,获取 StorageObject 元数据并设置 Content-Length:
header。这通常会使 HTTP 客户端表现得更好一些。我相信这将在 $image->info()
.