Zwischenspeichern von HTTP-Antworten, wenn sie dynamisch von PHP erstellt werden

Lesezeit: 4 Minuten

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!

  • 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

Zwischenspeichern von HTTP Antworten wenn sie dynamisch von PHP erstellt werden
Jack

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.

  • Es ist mein Problem, dass ich vergessen habe zu erwähnen, dass es unmöglich ist, PHP zu eliminieren. Es könnte eine komplizierte Logik innerhalb des PHP geben.

    – Mehran

    15. Mai 2012 um 7:43 Uhr

  • @MehranZiadloo Vielleicht hast du meine Antwort nicht verstanden, ich habe sie umformuliert.

    – Jack

    15. Mai 2012 um 7:45 Uhr

  • Obwohl Ihr Update Ihren Punkt verdeutlicht hat, ist es leider immer noch unmöglich, PHP zu eliminieren, da der Inhalt manchmal eher generiert als geladen wird. Danke trotzdem.

    – Mehran

    15. Mai 2012 um 7:52 Uhr

  • Habe die Antwort nochmal aktualisiert. Sie haben angegeben, dass “der Zweck darin besteht, eine Datei aus dem Dateisystem zu lesen”, also sollten Sie sich darüber klarer sein 🙂

    – Jack

    15. Mai 2012 um 8:03 Uhr

  • Wie funktioniert der Ping genau? Ich meine, wenn der Client eine Seite anfordert, sehe ich keine HTTP_IF_MODIFIED_SINCE-Variable und ich habe die ETAG beim Bereitstellen des Dokuments festgelegt. Da dies nicht funktioniert, habe ich eine andere Methode entwickelt, die den Server mit Ajax ‘pingt’ und nach der Versionsnummer fragt. Wenn die Versionsnummer nicht mit der Seite übereinstimmt, wird sie von window.location.reload(true) neu geladen, um eine Anfrage zu erzwingen. Beim Zwischenspeichern aller Inhaltsteile (z. B. CSS und JS) ist nur eine Anfrage erforderlich, um auf Unterschiede zu prüfen, anstatt „304 Not Modified“-Antworten zuzuweisen. Vielleicht schlecht, dass es auf JS angewiesen ist, aber funktioniert OK

    – Codebeat

    4. Dezember 2013 um 2:48 Uhr


846170cookie-checkZwischenspeichern von HTTP-Antworten, wenn sie dynamisch von PHP erstellt werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy