2

我有基于 Laravel 的 Web 和移动应用程序,可以在 AWS S3 上存储图像,我想添加缓存支持,因为即使是少数应用程序用户也会在 AWS S3 上产生数百甚至数千个 GET 请求。

要从移动应用程序获取图像,我使用由这样的代码处理的 GET 请求

public function showImage(....) {
  ...
  return Storage::disk('s3')->response("images/".$image->filename);
}

在下一张图片中,您可以看到我收到的响应标头。Cache-Control 显示无缓存,因此我假设移动应用程序不会缓存此图像。

在此处输入图像描述

  1. 如何为此请求添加缓存支持?我应该这样做吗?
  2. 我知道Laravel Documentaion 建议缓存文件存储 - 我应该为 S3 实现它吗?是否有助于减少从 AWS S3 读取文件的 GET 请求计数?我在哪里可以找到有关它的更多信息。
4

2 回答 2

1

我建议使用此处所述的临时 URL:https ://laravel.com/docs/7.x/filesystem#file-urls

然后使用 Cache 来存储,直到过期:

$value = Cache::remember('my-cache-key', 3600 * $hours, function () use ($hours, $image) {
    $url = Storage::disk('s3')->temporaryUrl(
        "images/".$image->filename, now()->addMinutes(60 * $hours + 1)
    ); 
});

每当您在 S3 中更新对象时,请执行以下操作以删除缓存的 URL:

Cache::forget('my-cache-key');

...您将获得新对象的新 URL。

于 2020-06-29T20:06:57.907 回答
0

您可以使用 CloudFlare 之类的 CDN 服务并设置缓存标头以让 CloudFlare 将缓存保留一定时间。

$s3->putObject(file_get_contents($path), $bucket, $url, S3::ACL_PUBLIC_READ, array(), array('Cache-Control' => 'max-age=31536000, public'));

这样,文件将由 CloudFlare 获取一次,存储在他们的服务器上,然后提供给用户,而无需为每个请求从 S3 请求图像。

另请参阅:
如何降低数据传输成本?Amazon S3 --> Cloudflare --> Visitor
如何使用 PHP 脚本为 AWS S3 存储桶中的所有对象设置 Expires 和 Cache-Control 标头

于 2020-06-30T07:26:14.037 回答