Jon*_*ann 11 php amazon caching amazon-s3 cloudflare
我最近开始使用Amazon S3向访问者提供图像,因为这会减少服务器负载.现在,出现了一个新问题:今天我查看了我的AWS账单.我注意到我有一个巨大的账单等着我 - 在20天内总共有4TB的AWS数据传输.
显然这是因为大量传出的Amazon S3流量(到Cloudflare然后将其提供给访问者).现在我应该通过设置Cache头来减少所请求文件的数量(因为Cloudflare的Crawler会尊重它).我修改了我的代码:
$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ);
Run Code Online (Sandbox Code Playgroud)
至
$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ, array('Cache-Control' => 'public,max-age=31536000'));
Run Code Online (Sandbox Code Playgroud)
不过,它不起作用.Cloudflare不尊重Cache,因为Cache-Control在Header中不显示为"Cache-Control",而是显示为"x-amz-meta-cachecontrol".Cloudflare忽略了这一点.
有人有一个简单的解决方案吗?
TL; DR:我和这个人有或多或少相同的问题:http://support.bucketexplorer.com/topic734.html(那是在2008年)
编辑:我偶然发现了这一点:亚马逊S3没有缓存图像,但不幸的是,该解决方案对我不起作用.
编辑2:事实证明它没有用,因为我使用的是旧版"亚马逊S3类".我更新了,代码现在正常工作.
感谢您的时间.
如果您收到“x-amz-meta-cachecontrol”,很可能您没有正确设置标头。这可能只是您在代码中执行此操作的确切方式。这是应该的工作。我推断这是使用 Amazon S3 PHP Class 的 php?
尝试这个:
$s3->putObject(file_get_contents($path), $bucket, $url, S3::ACL_PUBLIC_READ, array(), array('Cache-Control' => 'max-age=31536000, public'));
Run Code Online (Sandbox Code Playgroud)
在S3 PHP 文档 putObjectFile中,Legacy Methods 下列出:
putObjectFile (string $file,
string $bucket,
string $uri,
[constant $acl = S3::ACL_PRIVATE],
[array $metaHeaders = array()],
[string $contentType = null])
Run Code Online (Sandbox Code Playgroud)
与此相比:
putObject (mixed $input,
string $bucket,
string $uri,
[constant $acl = S3::ACL_PRIVATE],
[array $metaHeaders = array()],
[array $requestHeaders = array()])
Run Code Online (Sandbox Code Playgroud)
您需要将 cache-control 设置为请求标头,但似乎无法使用 设置请求标头putObjectFile,只有元标头。您必须使用putObject并为其提供一个用于元标头的空数组,然后是另一个带有请求标头(包括缓存控制)的数组。
您还可以尝试我在下面列出的其他一些工作示例。
也可以看看:
如何使用 PHP 脚本(php)为 AWS S3 存储桶中的所有对象设置 Expires 和 Cache-Control 标头
更新 Amazon S3 和 CloudFront (python) 的缓存标头
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
| 归档时间: |
|
| 查看次数: |
3791 次 |
| 最近记录: |