2012-12-14 9 views
10

Seit Kurzem benutze ich Amazon S3, um meinen Besuchern Bilder zu liefern, da dies die Serverlast reduziert. Jetzt gibt es ein neues Problem: Heute habe ich mir meine AWS-Rechnungen angesehen. Ich habe bemerkt, dass ich eine riesige Rechnung habe, die auf mich wartet - es gab insgesamt 4 TB AWS-Datentransfer in 20 Tagen.Wie kann ich meine Datenübertragungskosten reduzieren? Amazon S3 -> Cloudflare -> Besucher

Offensichtlich ist dies, weil die hohe Menge an ausgehenden Amazon S3-Verkehr (zu Cloudflare, die es dann an die Besucher dient). Jetzt sollte ich die Anzahl der angeforderten Dateien reduzieren, indem ich einen Cache-Header setze (da Cloudflares Crawler das respektiert). Ich habe wie dies meinen Code geändert:

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

zu

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

Dennoch ist es nicht funktioniert. Cloudflare berücksichtigt den Cache nicht, da das Cache-Control nicht als "Cache-Control" im Header, sondern als "x-amz-meta-cachecontrol" angezeigt wird. Cloudflare ignoriert dies.

Hat jemand eine einfache Lösung dafür?

TL; DR: Ich habe mehr oder weniger das gleiche Problem wie dieser Kerl: http://support.bucketexplorer.com/topic734.html (das war im Jahr 2008)

EDIT: Ich habe auf dieser gestolpert: Amazon S3 not caching images aber leider diese Lösung nicht arbeite für mich.

EDIT 2: Es stellte sich heraus, dass es nicht funktionierte, weil ich eine alte Version der "Amazon S3-Klasse" verwendete. Ich habe aktualisiert und der Code funktioniert jetzt.

Vielen Dank für Ihre Zeit.

Antwort

4

Wenn Sie "x-amz-meta-cachekontrolle" erhalten, ist es wahrscheinlich, dass Sie die Header nicht richtig einstellen. Es könnte genau so sein, wie Sie es in Ihrem Code tun. Diese ist soll funktionieren. Ich bin davon überzeugt, dass dies PHP mit Amazon S3 PHP-Klasse ist?

Try this:

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

Im S3 PHP docsputObjectFile unter Legacy-Methoden aufgeführt wird:

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

auf diese vergleichen:

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

Sie müssen Cache-Control setzen, wie a Anfrage Header, aber ap Birnen, dass es keine Möglichkeit gibt, Anforderungsheader mit putObjectFile, nur Meta-Header zu setzen. Sie müssen putObject verwenden und geben Sie ein leeres Array für Meta-Header und dann ein anderes Array mit den Anfrage-Header (einschließlich Cache-Control).

Sie können auch einige der anderen Arbeitsbeispiele versuchen, die ich unten aufgeführt habe.

Siehe auch:

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

ich herausgefunden, warum es nicht funktioniert. Es stellte sich heraus, dass ich eine alte Version der "Amazon S3 PHP Class" verwendet habe. Ich habe Ihren vorgeschlagenen Code aktualisiert und verwendet, und jetzt haben die neuen Dateien einen Cache-Control-Satz. Groß! Ich werde auch in Ihrem zweiten Link schauen, um alle Cache-Control-Header für die Dateien, die bereits im Bucket sind, festzulegen. Dies sollte alle meine Probleme lösen. Danke für alles! –

+0

@Jonas: Konnten Sie Ihren Datentransfer nach diesem Ansatz reduzieren? .. Ich weiß es ziemlich lange .. aber ich bin jetzt in Ihrem Boot. –

1

Sie jetzt kann. Gehe zu s3 Eimer. Öffnen Sie die Datei und legen Sie Eigenschaft

Aws console

+0

Nizza finden! Danke für das Update. –