2014-12-22 10 views
5

Hauptproblem:Wie kann man das Ablaufdatum der Facebook-Foto-URL effizient abrufen und sie vor Ablauf erneuern?

  • Cashes URL von Facebook-Foto CDN
  • Die Fotos zu einem bestimmten Zeitpunkt gültig bis

Mein "technisches" Problem:

  • Facebook CDN "gültig bis" Kopfzeile scheint nicht zuverlässig zu sein (oder ich weiß nicht, wie man mit ihnen umgeht)

ROTATION Mit Ablaufdatum abzurufen:

  • curl -i -X HEAD https://scontent-b.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/q82/p320x320/10458607_4654638300864_4316534570262772059_n.jpg?oh=9d34386036754232b79c2208c1075def&oe=54BE4EE2

  • Eine Minute, bevor es zurück: Mon, 05 Jan 2015 01:34:28 GMT

  • es wieder aufrufen jetzt zurückgegeben: Mon, 05 Jan 2015 01:35:27 GMT

  • beide Male " Cache-Control "gab das gleiche zurück: Cache-Control: max-age=1209600

Bisher:

  • Es scheint wie eine der zuverlässigsten Möglichkeiten wäre, einen Hintergrund-Job zu haben, die Fotos die ganze Zeit überprüft, aber das fühlt sich ein bisschen „falsch“, wie " brutaler Zwang ".
  • einen Hintergrundjob zu haben würde möglicherweise abgelaufen Bilder ermöglichen diese Foto-URL zu dem Moment werden serviert „erneuert“ wird

Meine Fragen sind:

  • Sollte ich die max-age-Parameter verwenden auch wenn es sich nicht zu ändern scheint?
  • Gibt es eine zuverlässige Möglichkeit, die CDN-URL von Facebook zu verwenden?
  • Jede andere Idee, wie dies umgesetzt werden sollte?
  • < witz> Sollte facebook API verwendet werden, um schlecht benehmende Programmierer zu bestrafen? </witz>

Mögliche Lösungen?

  • prüfen Facebook für die letzte URL, bevor sie eine CDN-URL dient

    ~> würde meine Wünsche viel verlangsamen

  • einen Hintergrund-Job Haben Sie die URL und Ablauf zu erneuern Daten

    ~> hätte möglicherweise Fotos abgelaufen, während der Job sie nicht "erwischt"

  • Laden Sie die Fotos zu mein eigenes CDN

    ~> keine gute Praxis i

UPDATE erraten würde: ~> Vielleicht auf ihrem eigenen CDN Zunder tatsächlich Bilder Cache des Benutzers: https://gist.github.com/rtt/10403467 so scheinen, wie Facebook mit ihm Art von OK ist ?

+0

"wäre ein Hintergrund-Job, der die Fotos die ganze Zeit überprüft, aber das fühlt sich ein bisschen" falsch "an, wie" Brute Forcing "." --- und wenn Sie für eine Sekunde denken, werden Sie feststellen, dass Facebook nicht weiß, wenn ein Benutzer sein Foto ändert, also können sie das genaue Ablaufdatum nicht setzen. Also haben sie es einfach als 14 Tage angegeben, von denen sie annehmen, dass es in Ordnung ist. Also tun Sie einfach, was FB Ihnen mit HTTP-Headern vorschreibt. – zerkms

+0

Abgesehen von dieser Hypothese (Benutzer löscht ein Foto), denken Sie, ich sollte den Max-Age-Wert oder das "Expires" -Datum verwenden? – kroe

+0

Ein weiteres Problem ist, dass es manchmal von Benutzern gelöscht wird und nicht von ihren CDNs gelöscht wird - zumindest war das der Fall. – kroe

Antwort

16

Expires bedeutet genau eine Sache, und es ist nicht das, was Sie denken, es ist:

Die Verfällt entity-Header-Feld das Datum/die Zeit, nach der gibt die Antwort abgestanden angesehen wird. [...]

Das Vorhandensein eines Expires-Felds impliziert nicht, dass die ursprüngliche Ressource sich vor, nach oder nach dieser Zeit ändert oder nicht mehr existiert.

- RFC 2616 §14.21, Hervorhebung von mir

Wenn Facebook-Bild-URLs nach einem gewissen Punkt in der Zeit aufhören zu arbeiten, das ist ihr Geschäft. Ihre HTTP-Header müssen es nicht erwähnen, und tatsächlich nicht.

Das heißt, ich verdächtigen, dass der oe URL-Parameter einen Ablauf Zeitstempel enthalten kann. Wenn ich 54be4ee2 als Hexadezimalzahl interpretiere, die einen UNIX-Zeitstempel enthält, bekomme ich den 20. Januar 2015, was fast genau einem Monat entspricht. Könnte das der Wert sein, nach dem Sie suchen?

+0

Tatsächlich wird" Expires "nicht für alle Bilder zurückgegeben. Also ich glaube, ich sollte jetzt() + Max-Alter verwenden? – kroe

+4

Nur nach einigen Tests zu bestätigen, bedeutet der Parameter oe, wenn die Bilder in Hexadezimal ablaufen. Guter Fang @duskwuff –