Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如何降低AWS S3数据传输成本?_Laravel_Amazon Web Services_Amazon S3_Caching_Amazon Cloudfront - Fatal编程技术网

Laravel 如何降低AWS S3数据传输成本?

Laravel 如何降低AWS S3数据传输成本?,laravel,amazon-web-services,amazon-s3,caching,amazon-cloudfront,Laravel,Amazon Web Services,Amazon S3,Caching,Amazon Cloudfront,我有一个AWS S3存储桶,用于存储laravel应用程序的公共和私有文件组合,如下所示: <img src="http://myapp.com/files/10"/> AWS存储桶和文件夹: myapp |____private |____public 在my blade文件中,图像显示如下: <img src="http://myapp.com/files/10"/> 这是我的控制器显示和上载文件的方法:

我有一个AWS S3存储桶,用于存储laravel应用程序的公共和私有文件组合,如下所示:

<img src="http://myapp.com/files/10"/>
AWS存储桶和文件夹:

myapp
    |____private
    |____public
在my blade文件中,图像显示如下:

<img src="http://myapp.com/files/10"/>
这是我的控制器显示和上载文件的方法:

public function show(Request $request, $id)
{
    $file = \App\File::findOrFail($id);

    $user = auth()->check() ? auth()->user() : new User;

    $this->authorizeForUser($user, 'show', $file);

    return Image::make(Storage::disk('s3')->get($file->path))->response();

} 


public function store(FileRequest $request)
{

    $file = $request->file('file');
    $fileType = strtolower($request->input('file_type'));
    $filePath = $fileType . '/' . Str::random(40) . '.' .  $file->getClientOriginalExtension();
   
    $user = auth()->user();

    DB::beginTransaction();

    try
    {
        $this->authorizeForUser($user, 'store', \App\File::class);

        $newFile = \App\File::create([
               "name"          => $file->getClientOriginalName(),
               "path"          => $filePath,
               "size"          => $file->getSize(),
               "mime_type"     => $file->getMimeType(),
               "type"          => $fileType, 
               "user_id"       => $user->id
        ]);

        $image = Image::make($file->getRealPath())->resize(360, 180);
        
        Storage::disk('s3')->put($filePath, $image->stream());
       
        $content = "<textarea data-type=\"application/json\">{\"ok\": true, \"message\": \"Success\", \"path\": \"" . $newFile->path . "\",  \"id\": \"" . $newFile->id . "\",  \"name\": \"" . $newFile->name . "\" }</textarea>";

        DB::commit();

    } catch (\Exception $e)
    {
        DB::rollback();

        $error =  'There was a problem uploading your file';
        $content = "<textarea data-type=\"application/json\">{\"ok\": false, \"message\": \"" . $error . "\" }</textarea>";

    }

    return response($content);

}
我想添加缓存支持,因为即使是少量的应用程序用户也会在AWS S3上生成数百个,有时甚至是大量的GET请求。如果bucket是私有的,即只能通过IAM用户访问,如何缓存文件以降低S3成本

我读过一些帖子,建议使用cloudfront,但这不只是增加了另一个成本吗?我如何使用上面提到的控制器方法实现cloudfront,以及bucket在根级别是私有的

使用laravels文件缓存是否合适

我很想知道我可以在S3和laravel中使用什么技术,最好是一些步骤和指导代码会真正有所帮助


另外,我已经看过下面的帖子了

最简单的选择是使用CloudFront,如果您的问题是成本,那么当请求转到CloudFront时,AWS S3不收取数据传输费用

使用S3设置CloudFront非常重要,您可以保持存储桶的私有性,只需创建OAI即可

请查看以下链接:


由于CloudFront是一项公共服务,您需要将当前身份验证更改为另一种格式(检查此链接),或者您可以使用已签名的URL或已签名的Cookie(检查此另一个链接)提供私人内容;您可以使用现有IAM用户生成这些签名URL/签名cookie。

S3不收取向CloudFront传输数据的费用,但向Internet传输数据的费用。但是,它稍微便宜一点(CloudFront在us-east-1中为0.085美元,而S3为0.09美元)。是的,但它稍微便宜一点,但当您开始在CloudFront中访问缓存时,它将降低您的许多成本。除此之外,使用CloudFront还可以降低延迟,每GB成本将降低0.005美元。这并不“很多”。@Raul在我的控制器中,我有
Image::make(Storage::disk('s3')->get($file->path))->response()
从s3获取文件。如果我使用cloudfront,我将如何获取文件?@adam78我不知道您使用的是什么语言,但如果Storage::disk('s3')意味着像s3文件系统一样,您必须将请求更改为HTTP(S)请求。您是否考虑过像Cloudflare这样的非AWS解决方案?@Parsifal我将文件存储在Cloudflare上的何处?另外,没有现成的laravel api将cloudflare用作存储?cloudflare是一个CDN:它位于应用程序之外,并缓存已交付的文件。当用户第一次检索文件时,它来自您的站点。当该用户再次检索该文件时,它来自Cloudflare缓存。在您的情况下,它可能不合适,因为您正在授权所有映像请求。通过更改文件名以包含用户令牌,您当然可以使它们在每个用户的基础上进行缓存,但这只有在同一用户多次加载图像时才有帮助(在这种情况下,基于浏览器的缓存可以完成这项工作)。
public function show(User $user, File $file)
{
     if ($file->type == 'public' || (!is_null($user->getKey()) && $file->type == 'private'))
          return true;
     }
}