Laravel AWS S3存储映像缓存

时间:2020-06-27 15:56:26

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

我有一个基于Laravel的Web和移动应用程序,用于在AWS S3上存储图像,并且我想增加缓存支持,因为即使是少数应用程序用户也会在AWS S3上生成数百甚至是大量的GET请求。

要从移动应用程序中获取图片,我使用GET请求,该请求由此类代码处理

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

在下一张图片上,您可以看到我收到的响应标题。缓存控制显示无缓存,因此我认为移动应用程序将不会缓存该图像。

enter image description here

  1. 如何为该请求添加缓存支持?我应该这样做吗?
  2. 我知道用于Filestorage的Laravel Documentaion suggests caching-我应该在S3中实现它吗?它有助于减少来自AWS S3的GET请求读取文件的数量吗?我在哪里可以找到有关它的更多信息。

2 个答案:

答案 0 :(得分:0)

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

然后使用缓存存储它,直到它过期:

$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。

答案 1 :(得分: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请求图像。

另请参阅:
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