Ich denke, meine Frage scheint ziemlich beiläufig zu sein, aber ertragen Sie mich, wenn es interessant wird (zumindest für mich :)).
Stellen Sie sich eine PHP-Seite vor, deren Zweck darin besteht, eine angeforderte Datei aus dem Dateisystem zu lesen und als Antwort zurückzugeben. Nun stellt sich die Frage, wie man den Cache für diese Seite aktiviert. Hervorzuheben ist, dass die Dateien ziemlich groß sein können und die Aktivierung des Cache den Client davor bewahrt, denselben Inhalt immer wieder herunterzuladen.
Die ideale Strategie wäre die Verwendung des Anforderungsheaders „If-None-Match“ und des Antwortheaders „ETag“, um ein Reverse-Proxy-Cache-System zu implementieren. Obwohl ich das so weit weiß, bin ich mir nicht sicher, ob dies möglich ist oder was ich als Antwort zurückgeben soll, um diese Technik zu implementieren!
Das Bereitstellen riesiger oder vieler Hilfsdateien mit PHP ist nicht genau das, wofür es gemacht wurde.
Betrachten Sie stattdessen X-Beschleunigung für nginx, X-Sendfile für Lighttpd bzw mod_xsendfile für Apache.
Die anfängliche Anfrage wird von PHP verarbeitet, aber sobald die Download-Datei bestimmt wurde, werden einige Header gesetzt, um anzuzeigen, dass der Server das Senden der Datei handhaben soll, wonach der PHP-Prozess freigegeben wird, um etwas anderes zu bedienen.
Sie können dann den Webserver verwenden, um das Caching für Sie zu konfigurieren.
Statisch generierter Inhalt
Wenn Ihre Inhalte aus PHP generiert werden und besonders teuer in der Erstellung sind, könnten Sie die Ausgabe in eine lokale Datei schreiben und die obige Methode erneut anwenden.
Wenn Sie nicht in eine lokale Datei schreiben können oder möchten, können Sie HTTP-Antwortheader verwenden, um das Caching zu steuern:
Expires: <absolute date in the future>
Cache-Control: public, max-age=<relative time in seconds since request>
Dies veranlasst Clients, den Seiteninhalt zwischenzuspeichern, bis er abläuft oder wenn ein Benutzer ein Neuladen der Seite erzwingt (z. B. F5 drücken).
Dynamisch generierte Inhalte
Bei dynamischen Inhalten möchten Sie, dass der Browser Sie jedes Mal anpingt, aber den Seiteninhalt nur sendet, wenn es etwas Neues gibt. Sie können dies erreichen, indem Sie einige andere Antwortheader festlegen:
ETag: <hash of the contents>
Last-Modified: <absolute date of last contents change>
Wenn der Browser Ihr Skript erneut pingt, fügt er jeweils die folgenden Anforderungsheader hinzu:
If-None-Match: <hash of the contents that you sent last time>
If-Modified-Since: <absolute date of last contents change>
Die ETag
wird hauptsächlich verwendet, um den Netzwerkverkehr zu reduzieren, da Sie ihn in einigen Fällen zuerst berechnen müssen, um den Inhaltshash zu kennen.
Die Last-Modified
ist am einfachsten anzuwenden, wenn Sie lokale Dateicaches haben (Dateien haben ein Änderungsdatum). Eine einfache Bedingung macht es möglich:
if (!file_exists('cache.txt') ||
filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// update cache file and send back contents as usual (+ cache headers)
} else {
header('HTTP/1.0 304 Not modified');
}
Wenn Sie keine Datei-Caches durchführen können, können Sie trotzdem verwenden ETag
um festzustellen, ob sich die Inhalte zwischenzeitlich geändert haben.
Cooles Auge. Passt aber immer noch nicht zu meinem.
– Madaras Geist
9. Juli 2013 um 9:30 Uhr
Seien Sie sich nicht so sicher, der Besitzer dieses Auges ist jetzt Juubis Jinchuuriki!
– Mehran
10. Juli 2013 um 13:08 Uhr
Vorerst aber wurde mein Trumpf noch nicht aufgedeckt. Lassen Sie uns diesen Chat fortsetzen Anime- und Manga-Chat. Um diesen Thread nicht zu überladen.
– Madaras Geist
10. Juli 2013 um 13:11 Uhr
Ich bin schon da, aber die Sache ist, dass ich kaum Zeit habe, etwas zu posten. Es tut uns leid.
– Mehran
10. Juli 2013 um 14:49 Uhr