2012-12-14 28 views
10

Gần đây tôi đã bắt đầu sử dụng Amazon S3 để phục vụ hình ảnh cho khách truy cập của mình vì điều này sẽ làm giảm tải máy chủ. Bây giờ, có một vấn đề mới: Hôm nay tôi nhìn vào hóa đơn AWS của tôi. Tôi nhận thấy rằng tôi có một hóa đơn khổng lồ đang chờ tôi - đã có tổng cộng 4TB chuyển dữ liệu AWS trong 20 ngày.Làm cách nào để giảm chi phí chuyển dữ liệu? Amazon S3 -> Cloudflare -> Visitor

Rõ ràng điều này là do số lượng lưu lượng truy cập Amazon S3 gửi đi cao (đến Cloudflare mà sau đó phục vụ cho khách truy cập). Bây giờ tôi nên giảm số lượng tệp được yêu cầu bằng cách đặt tiêu đề Cache (vì Trình thu thập thông tin của Cloudflare sẽ tôn trọng). Tôi đã sửa đổi mã của tôi như thế này:

$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')); 

Tuy nhiên, nó không hoạt động. Cloudflare không tôn trọng Cache vì Cache-Control không hiển thị là "Cache-Control" trong Header mà thay vào đó là "x-amz-meta-cachecontrol". Cloudflare bỏ qua điều này.

Có ai có giải pháp dễ dàng cho việc này không?

TL; DR: tôi có nhiều hoặc ít hơn cùng một vấn đề như anh chàng này: http://support.bucketexplorer.com/topic734.html (đó là vào năm 2008)

EDIT: Tôi đã stumbled khi này: Amazon S3 not caching images nhưng tiếc là giải pháp mà không làm việc cho tôi.

CHỈNH SỬA 2: Tắt nó không hoạt động vì tôi đang sử dụng phiên bản cũ của "lớp Amazon S3". Tôi đã cập nhật và mã hoạt động ngay bây giờ.

Cảm ơn bạn đã dành thời gian.

Trả lời

4

Nếu bạn đang nhận "x-amz-meta-cachecontrol", có khả năng bạn không đặt tiêu đề chính xác. Nó có thể chỉ là cách chính xác bạn đang làm nó trong mã của bạn. Điều này phải hoạt động. Tôi deducing này là php bằng cách sử dụng Amazon S3 PHP Class?

Hãy thử điều này:

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

Trong S3 PHP docsputObjectFile được liệt kê dưới Legacy Phương pháp:

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

Hãy so sánh thế này:

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

Bạn cần phải thiết lập bộ nhớ cache kiểm soát như a yêu cầu tiêu đề, nhưng ap lê rằng không có cách nào để đặt tiêu đề yêu cầu với putObjectFile, chỉ có tiêu đề meta. Bạn phải sử dụng putObject và cung cấp cho nó một mảng trống cho tiêu đề meta và sau đó là một mảng khác với tiêu đề yêu cầu (bao gồm kiểm soát bộ nhớ cache).

Bạn cũng có thể thử một số ví dụ hoạt động khác mà tôi đã liệt kê bên dưới.

Xem thêm:

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

+0

Tôi đã tìm ra lý do tại sao nó không hoạt động. Hóa ra tôi đã sử dụng một phiên bản cũ của "Amazon S3 PHP Class". Tôi đã cập nhật và sử dụng mã được đề xuất của bạn và giờ đây các tệp mới có bộ Bộ nhớ cache. Tuyệt quá! Tôi cũng sẽ xem xét liên kết thứ hai của bạn để đặt tất cả các tiêu đề Bộ nhớ cache-Kiểm soát cho các tệp đã có trong nhóm. Điều này sẽ giải quyết mọi vấn đề của tôi. Cám ơn vì tất cả! –

+0

@Jonas: Bạn có thể giảm chuyển dữ liệu của mình theo cách tiếp cận này không? .. Tôi biết nó khá dài .. nhưng bây giờ tôi đang ở trong thuyền của bạn. –

1

Bạn có thể bây giờ. Chuyển đến xô s3. Mở tệp và đặt thuộc tính

Aws console

+0

Rất đẹp! Cảm ơn các cập nhật. –

Các vấn đề liên quan