php - 如何降低数据传输成本? Amazon S3 --> Cloudflare --> 访问者

标签 php caching amazon-s3 amazon cloudflare

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

显然,这是因为大量传出 Amazon S3 流量(到 Cloudflare,然后将其提供给访问者)。现在我应该通过设置缓存 header 来减少请求的文件数量(因为 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-Control 在 header 中未显示为“Cache-Control”,而是显示为“x-amz-meta-cachecontrol”。 Cloudflare 忽略了这一点。

有人对此有简单的解决方案吗?

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

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

编辑 2: 结果证明它不起作用,因为我使用的是“Amazon S3 类”的旧版本。我更新了,代码现在可以工作了。

感谢您的宝贵时间。

最佳答案

如果您收到“x-amz-meta-cachecontrol”,很可能是您没有正确设置 header 。这可能只是您在代码中执行此操作的确切方式。这应该工作。我推断这是使用 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 列在 Legacy Methods 下:

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()])

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

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

另见:

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

关于php - 如何降低数据传输成本? Amazon S3 --> Cloudflare --> 访问者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881692/

相关文章:

php - 如何在 Codeigniter 中实例化同一对象的多个实例?

amazon-web-services - "Strong Consistency"与 "Read-after-write Consistency"

amazon-s3 - 在 CFN 资源提供程序测试中删除 s3 存储桶时 AccessDenied

ruby - aws/s3 gem 与 JRuby 不兼容

PHPDoc:嵌套数组中的类型提示(例如 2 维)

php - PHP 的 xsd 日期时间转换

javascript - PHP Mailer,在发送电子邮件时阻止整个服务器执行

php - Linux 服务器 : Would a cache scheme help reduce hits to 3rd-party server?

javascript - jQuery ui 自动完成缓存 xml 源

java - 是否有特定于 URL 的 hashCode 方法?