我有一个基于Laravel的Web和移动应用程序,用于在AWS S3上存储图像,并且我想增加缓存支持,因为即使是少数应用程序用户也会在AWS S3上生成数百甚至是大量的GET请求。
要从移动应用程序中获取图片,我使用GET请求,该请求由此类代码处理
public function showImage(....) {
...
return Storage::disk('s3')->response("images/".$image->filename);
}
在下一张图片上,您可以看到我收到的响应标题。缓存控制显示无缓存,因此我认为移动应用程序将不会缓存该图像。
答案 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