Auf einer meiner mobilen Websites speichere ich einfach die Profilbilder meiner Benutzer als "1.jpg" in ihrem Benutzerordner und gehe von dort aus schrittweise zu zusätzlichen Bildern, die sie hochladen. Dies bedeutet, dass der Dateiname bei jeder Änderung des Profilbilds beispielsweise gleich bleibt.
Ich wollte das Bild-Caching nutzen, damit das gleiche alte Bild nicht immer wieder heruntergeladen wird, wenn das Profil eines Benutzers angezeigt und erneut angezeigt wird, aber gleichzeitig möchte ich, dass die Browser meiner Benutzer dies tun Laden Sie das neue herunter, wenn es sich geändert hat.
Nach dem, was ich gelesen habe, scheint die einzige Möglichkeit, dies wirklich zu tun, darin zu bestehen, zufällige Dateinamen zu verwenden und alle diese Dateinamen in der Datenbank zu verfolgen, sodass Sie in letzter Zeit einen nicht ablaufenden Cache festlegen können -veränderte Bilder werden erneut gezogen, da sie einen neuen Dateinamen haben. Das Schöne an der Art und Weise, wie ich sie bisher strukturiert habe, ist jedoch, dass ich die Datenbank vollständig überspringen und direkt auf die Dateien zugreifen kann, da ihr Speicherort vorhersehbar ist.
Meine Frage ist also, ob es sich für mich lohnt, die gesamte Dateistruktur meiner Site zu ändern und das DB-Element hinzuzufügen, um das ewige Caching und das automatische erneute Herunterladen beim erneuten Hochladen zu gewährleisten.
Dies ist ein großes Unterfangen, aber wenn es als würdig erachtet wird, habe ich kein Problem damit, diese drastische Änderung voranzutreiben. Ich möchte nur sicherstellen, dass die "großen Jungs" das so machen, damit ich die Dateistruktur nie wieder ändern muss.
Vielen Dank.
Es gibt mehr als einen Weg zum Cachen.
Bedingtes GET
Wenn Sie diese Bilder im Dateisystem speichern und direkt über den Webserver bereitstellen, verwenden Sie wahrscheinlich bereits das bedingte Abrufen . Der Web - Server verwendet Dateisystem - Metadaten automatisch einen ETAG - Header zu setzen, und wird automatisch antworten mit „304 Not Modified“ , wenn der Browser enthält
If-Modified-Since
oderIf-Matches
Header in seiner Anfrage. (Alle Browser werden.)In diesem Fall wird nicht das gesamte Bild zurückgesendet, sodass Sie Bandbreiteneinsparungen erzielen. Es wird jedoch weiterhin eine GET-Anforderung ausgegeben, sodass Sie weiterhin den Overhead und die Latenz einer Anforderung haben.
Sie können die Anzahl der Anforderungen auf Kosten der Cache-Aktualität geringfügig verringern, indem Sie auf Ihrem Webserver
Cache-Control
Header mit einempublic,max-age=N
Wert für Ihre Bilder festlegen . Dies bedeutet, dass Caches die Ressource höchstensmax-age
Sekunden lang behalten können, bevor sie überprüfen müssen, ob sie aktualisiert wurde.HTTP definiert jedoch nur eine Möglichkeit, einen Cache-Eintrag ungültig zu machen, die möglicherweise nicht zur Semantik Ihrer Anwendung passt: Wenn Sie eine URL POSTEN oder PUTEN, die das Profilfoto aktualisiert, antworten Sie mit einem
Location: [url of photo]
Header, und der Cache-Eintrag für diese URL wird ungültig.(Dies ist der Mechanismus, mit dem Sie eine Webseite mit Kommentaren zwischenspeichern und die Seite dann vom Browser zwangsweise neu laden lassen können, nachdem der Benutzer einen neuen Kommentar veröffentlicht hat. Der Browser antwortet auf ein
POST /comment
mit303 See Other
und einLocation: /page/with/comment
. Beachten Sie, dass dies nicht verwendet wurde wegen eines langjährigen Fehlers in Firefox zu arbeiten .)Wenn Sie nicht viel Verkehr haben, ist dieser Ansatz zum Zwischenspeichern in Ordnung.
URLs ändern
Eine URL ist eine Darstellung einer Ressource. Eine andere Möglichkeit zum Verwalten des Caching besteht darin, die Cache-Parameter für die Ressource nicht zu ändern, sondern eine brandneue Ressource mit der Anweisung "Cache für immer" zu erstellen. Dies ist der Ansatz, den die "großen Jungs" bevorzugen, da sie keine zusätzlichen Anforderungen generieren können, wodurch sie viel Bandbreite sparen. Der Nachteil ist, dass viel mehr zusätzliche Buchhaltung erforderlich ist.
Hierfür gibt es zwei allgemeine Techniken.
Zeichenfolgen abfragen
Webserver ignorieren Abfragezeichenfolgen, wenn sie eine Datei aus dem Dateisystem bereitstellen. Caches jedoch nicht:
/1.jpg?t=12345
und/1.jpg?t=67890
sind zwei völlig unterschiedliche, nicht miteinander verbundene Ressourcen, obwohl der Server glaubt, dass sie gleich sind.Eine einfache Möglichkeit besteht darin, den Zeitstempel des Dateisystems als Abfragezeichenfolge anzuhängen, wenn Sie auf eine Ressource in Ihrem HTML-Code verweisen und einen langen
Expires
Header festlegen . Der Browser speichert diese Ressource dann für immer im Cache und führt keine GETs durch, solange sich die Abfragezeichenfolge nicht ändert.Ein Nachteil ist, dass es schwierig oder unmöglich ist, den Webserver über die neue URL für ein Element zu informieren, wenn Sie einen Cache zwangsweise ungültig machen möchten. Wenn ein Browser beispielsweise eine zwischengespeicherte HTML-Seite mit einer
/1.jpg?v=1
Referenz hat, aber zufällig den Eintrag für/1.jpg?v=1
gelöscht hat (möglicherweise ist ihm die Datei oder der Speicherplatz ausgegangen), wird eine neue Anforderung an gesendet/1.jpg?v=1
. Wenn sich das Bild in der Zwischenzeit geändert hat/1.jpg?v=2
, lautet die richtige Antwort entweder:301 Moved Permanently
. Sie würden dies tun, wenn Sie möchten, dass alle Ressourcen so neu wie möglich sind.Beides ist mit einem Webserver allein nur schwer möglich. Daher müssen Sie eine Webanwendung auch für Bildanforderungen aufrufen, was sowohl komplizierter als auch ressourcenintensiver sein kann. Webserver können Dateien sehr schnell bereitstellen, sodass der Overhead einer Webanwendung möglicherweise Ihre Bandbreite und Latenzgewinne verschlingt.
Dateinamen
Anstatt eine Abfragezeichenfolge hinzuzufügen, ändern Sie den Dateinamen. Dies bedeutet, dass es einfach ist, mehrere Versionen von Dateien im Dateisystem zu speichern, aber Sie müssen wahrscheinlich Dateimetadaten speichern und andere Datenbankbücher führen, um Ihre Ressourcen und deren Namen im Auge zu behalten.
quelle
304 Not Modified
Wenn Sie den http-Status lesen , sollten Sie in der Lage sein, auf eine Download-Anfrage mit 304 zu antworten, und den Server anweisen, die zwischengespeicherten Daten zu verwenden, um sie erneut an den Browser zu senden. und lesen Sie diese Frage /programming/2978496/make-php-page-return-304-not-modified-if-it-hasnt-been-modifiedquelle