如何降低数据传输成本?亚马逊S3 - > Cloudflare - >游客

时间:2012-12-14 15:34:27

标签: php caching amazon-s3 amazon cloudflare

我最近开始使用Amazon S3向访问者提供图像,因为这会减少服务器负载。现在,出现了一个新问题:今天我查看了我的AWS账单。我注意到我有一个巨大的账单等着我 - 在20天内总共有4TB AWS数据传输。

显然这是因为大量传出的Amazon S3流量(到Cloudflare然后将其提供给访问者)。现在我应该通过设置Cache头来减少所请求文件的数量(因为Cloudflare的Crawler会尊重它)。我修改了我的代码:

$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ);

$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ, array('Cache-Control' => 'public,max-age=31536000'));

但是,它不起作用。 Cloudflare不尊重Cache,因为Cache-Control在Header中不显示为“Cache-Control”,而是显示为“x-amz-meta-cachecontrol”。 Cloudflare忽略了这一点。

有没有人有这方面的简单解决方案?

TL; DR:我和这个家伙有或多或少相同的问题:http://support.bucketexplorer.com/topic734.html(那是在2008年)

编辑:我偶然发现了这个问题:Amazon S3 not caching images但不幸的是,该解决方案对我不起作用。

编辑2:原来它没有用,因为我使用的是旧版“亚马逊S3类”。我更新了,代码现在可以使用了。

感谢您的时间。

2 个答案:

答案 0 :(得分:4)

如果您收到“x-amz-meta-cachecontrol”,则可能是您没有正确设置标题。它可能就是您在代码中执行此操作的确切方式。这个 应该可行。我推断这是使用Amazon S3 PHP类的PHP?

试试这个:

$s3->putObject(file_get_contents($path), $bucket, $url, S3::ACL_PUBLIC_READ, array(), array('Cache-Control' => 'max-age=31536000, public'));

传统方法中列出了S3 PHP docs putObjectFile

putObjectFile (string $file, 
               string $bucket, 
               string $uri, 
               [constant $acl = S3::ACL_PRIVATE], 
               [array $metaHeaders = array()], 
               [string $contentType = null])

与此相比:

putObject (mixed $input, 
           string $bucket, 
           string $uri, 
           [constant $acl = S3::ACL_PRIVATE], 
           [array $metaHeaders = array()], 
           [array $requestHeaders = array()])

您需要将缓存控制设置为请求标头,但似乎无法使用putObjectFile设置请求标头,只能设置元标头。您必须使用putObject并为元头提供一个空数组,然后为请求头提供另一个数组(包括缓存控制)。

您还可以尝试我在下面列出的其他一些工作示例。

另见:

How to set the Expires and Cache-Control headers for all objects in an AWS S3 bucket with a PHP script(php)

Updating caching headers for Amazon S3 and CloudFront(python)

Set cache-control for entire S3 bucket automatically (using bucket policies?)

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

答案 1 :(得分:1)

你现在可以。转到s3桶。打开文件并设置属性

Aws console