【问题标题】:Laravel AWS S3 Storage image cacheLaravel AWS S3 存储图像缓存
【发布时间】:2020-10-18 02:08:08
【问题描述】:

我有基于 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 suggests caching 用于文件存储 - 我应该为 S3 实现它吗?是否有助于减少从 AWS S3 读取文件的 GET 请求计数?在哪里可以找到有关它的更多信息。

【问题讨论】:

标签: laravel amazon-s3 cache-control laravel-storage


【解决方案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。

【讨论】:

    【解决方案2】:

    您可以使用 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 请求图像。

    另请参阅:
    How can I reduce my data transfer cost? Amazon S3 --> Cloudflare --> Visitor
    How to set the Expires and Cache-Control headers for all objects in an AWS S3 bucket with a PHP script

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多