gzipping,AWS S3同步,云端和我的服务器问题

时间:2017-06-21 11:31:35

标签: amazon-web-services amazon-s3 yii2 aws-sdk amazon-cloudfront

我要实现的目标是将我的静态资源CSS, JS, images, uploded images(约1百万)同步到S3 bucket并使用cloudfront传递它们。对于同步,我使用的是AWS PHP SDK v2.8x。以下是我的代码:

    $folder = $_GET['folder'];
    $concurrency = $_GET['concurrency'];
    $force = $_GET['force'];
    $rootPath = Yii::$app->params['root_path'];
    $bucket = 'my-bucket';
    $client = S3Client::factory(array( 
        'key' => "my-key", 
        'secret' => "my-secret",
        'stats' => true
    ));
    $params = array();
    $metadata = array();
    $options = array();
    $params['ACL'] = 'public-read';
    //$params['ContentEncoding'] = 'gzip';
    $params['Expires'] = 'Wed, 20 Jun 2018 07:48:05 GMT';
    $params['CacheControl'] = 'max-age=31536000';
    $options['params'] = $params;
    $options['concurrency'] = $concurrency;
    //$options['debug'] = true;
    $options['force'] = $force;
    $client->uploadDirectory($rootPath.'/'.$folder, $bucket, $folder, $options);

我已成功将所有内容上传到S3存储桶,并且与cloudfront同步也正常运行。但问题是我无法gzip任何这样的内容导致巨大的页面大小。此外,过期标头也不会反映在云端。如果我启用$params['ContentEncoding'] = 'gzip'; 我得到ERR_CONTENT_DECODING_FAILED。我也对CloudFront设置进行了更改,但似乎没有任何效果。 另外,请帮助我了解同步S3,CloudFront和我的服务器的最佳实践。

我目前的php框架是YII2。

如果需要补充信息,请告诉我,我会进行编辑。

提前致谢。

1 个答案:

答案 0 :(得分:2)

$params['ContentEncoding'] = 'gzip';实际上并没有gzip你的内容 - 它用于表示你在上传之前已经自己解压缩了它。

如果您设置了该内容,并且没有对内容进行gzip,则ERR_CONTENT_DECODING_FAILED将是正确的。

如果您在CloudFront缓存行为中将“自动压缩对象”设置为“是”,则可以将内容存储在未压缩的S3中,只需让CloudFront对其进行gzip。

正确设置后,为*执行CloudFront缓存失效,然后再次测试。

另外,请勿设置Expires标题。你几乎肯定不希望这样。

在检查CloudFront的标头时,请注意Age。这是多久以前,CloudFront在几秒钟内从S3获取对象。