Frage zum Caching mit PHP

Radhad

Erfahrenes Mitglied
Hallo zusammen,

ich bin derzeit noch dabei, eine Template Klasse & eine Caching Klasse zu entwickeln. Mittels ethereal habe ich lokal bei mir mal die HTTP-Requests angeschaut und gesehen, dass es sogar funktioniert, einen 304 - Not Modified Header abzuschicken, wenn keine Änderungen aufgetreten sind. Allerdings ist das noch nicht alles schön gekapselt in den Klassen (war ja auch ersteinmal nur ein Test).

Neben dem Caching per Header schreibe ich den output der Template-Klasse auch in eine Datei, und gebe diese je nachdem zurück. Dazu habe ich aber noch ein paar Verständnis-Fragen, da ich noch nicht so viel Erfahrung mit Caching gesammelt habe.

Meine Fragen
Und zwar setzt man ja einen Expires-Header, kann ich hierbei ohne Probleme das Datum der letzten Änderung der Datei verwenden und anhand dessen die Gültigkeitsdauer bestimmen?

Wie lange sollte so eine Seite gültig sein? Dafür habe ich 2 Ansätze.
  1. Jede Datei bekommt eine Gültigkeitsdauer von x Sekunden
  2. Jede Seite bekommt eine eigene Gültigkeitsdauer, je nachdem was der Inhalt ist
  3. Die Datei wird nur dann erneuert, wenn der Inhalt sich ändert (durch eine Aktion eines Users als Beispiel)


Mehr fällt mir gerade erst einmal nicht ein, aber für weiterführende Tipps zum Thema Caching bin ich sehr dankbar!



Gruß Radhad

[EDIT]
Im Anhang ist mal ein Screenshot von der Kommunikation zwischen Browser & Apache. Die Gültigkeit der Datei war beim Test 10 Sekunden. Hilft vielleicht beim beantworten der Fragen ;)
 

Anhänge

  • Screenshot.png
    Screenshot.png
    82,2 KB · Aufrufe: 83
Zuletzt bearbeitet:
Also, dein Link geht zu 100% am Thema vorbei - ich will ja garnicht Caching verhindern sondern Caching nutzen! Die Grafik im Anhang verdeutlicht nur, dass es funktioniert (sogar mit "304 - Not Modified"-Response). Vielleicht solltest du meinen Beitrag nochmal genau lesen ;)


Gruß Radhad

PS: PHP deaktiviert per default Caching (also schickt entsprechende Header, welche man aber überschreibt - zumindest laut eines Forumbeitrags in einem anderen Forum).
 
Nunja, wenn man eine Möglichkeit hat, Caching zu verhindern, zeigt diese Möglichkeit auch auf, wie man Caching nutzen kann. Von daher ist mein Beitrag nicht am Thema vorbei.

Was hindert dich daran, bei pre-check/post-check statt 0 entsprechende Timestamps zu hinterlegen, wann ein Cache ablaufen soll?

*lieb-gugg*
 
Nunja, mein Caching klappt ja so weit schon ;) Oder hab ich da was übersehen? Also ich beschreib mal kurz wie das funktioniert bei mir (alles selber geschrieben).

Der Browser soll die Seite http://localhost/index.php laden. Das PHp Script wird ausgeführt. An einer Stelle wird geprüft, ob die Cache-Datei (index.html) im Ordner der gecachten Templates existiert. Wenn nein, render das Template und schreibe es in die Datei und gib es aus. Wenn sie existiert, wird geprüft, ob sie noch gültig ist. Wenn sie noch gültig ist, und der Browser ein "If-Not-Modified" header schickt, schick einen "304 - Not Modified" header zurück ansonsten schick ihm den Inhalt der "index.html".

Mich interessiert an der Stelle, was eine gute Lebensdauer einer "index.html" dabei ist. Ich spare mir also das erneute ausführen aller Methoden, wenn sich an der Datei nichts geändert hat bzw. schicke erst garnicht den ganzen Inhalt, wenn dieser schon im lokalen Cache ist.

Woran soll ich das festmachen, wann eine Datei neu erstellt werden soll. Zum testen ist diese nur 10 Sekunden gültig, was ein zu niedriger Wert ist, ausgehend von der "LastModified" Angabe der Datei selbst. Zumal es auch Dateien gibt, die sich wohl eher selten ändern -> Der Newsartikel an sich, die Startseite vielleicht oder die Detail-Seite eines Benutzers. Andere Seiten ändern sich ständig -> Forum oder Blog's (gut, kommt auch auf die Anzahl der Benutzer an) - aber da lohnt sich ein Caching denke ich nicht wirklich. Und genau darum geht es mir ;) Wie stell ich das am besten ein :)


Index.php als Beispiel, enthält HTML-Header-Template, Index-Template, News-Template(s) (je nachdem wie viele News existieren), HTML-Footer-Template.
Wenn die Seite sich nur ändert, wenn eine neue News hinzukommt, würd ich sagen reicht ein "On Demand"-Template. Werden zusätzlich die letzten X Forumsbeiträge angezeigt, wäre ein "OnExpire"-Template besser.

Wie ist das, wenn sich Teile der Webseite ändern, wenn der User eingeloggt ist? Kann man dann Teile der Seite Cachen? z.B. nur die Inhalte außer HTML-HEader & HTML-Footer (weil dort evtl. User-Relevante Dinge enthalten sind)? Kann man dann immernoch nen "304 - Not Modified" Header setzen?


Anhang
OnDemand = nach einer Aktion ein neues Template-File erstellen
OnExpire = nach Ablauf der Gültigkeitsdauer ein neues Template-File erstellen
 
Ich nehme mal an, du beziehst die Inhalte aus der DB. Wenn du in der DB für den jeweiligen Eintrag hinterlegst, in der die Timestamps der letzten Änderung hinterlegt werden, kannst du die prima mit den letzten Änderungsdaten der Cache-Dateien vergleichen. Ist der Cache neuer als das letzte Änderungsdatum in der DB, hat sich am Inhalt nichts geändert und du kannst den Not-Modified Header senden. Wenn die letzten Änderungen in der DB neuer als das Cache-Datum, schickst du die Daten halt neu.

Dann benötigst du einen Cache-Lifetime-Faktor nicht, da du das "manuell" steuerst.

Edit:

Zu deinen weiteren Fragen: Es bei dem von mir beschriebenen Szenario nicht darauf an, wie häufig Änderungen vollzogen werden. Wenn du deine Engine nach dem Prinzip aufbaust, sollte das mit dem Not-Modified auch funktionieren. Ist nur die Frage, ob auch alle gängigen Browser den Header kennen und akzeptieren. Ich kenne den Header zwar, habe ihn jedoch aus diesem Grund noch nie angewendet.
 
Zuletzt bearbeitet:
Also "304" ist HTTP/1.0 und HTTP/1.1 konform. Ich brauche die Inhalte aus der DB nicht vergleichen, da der ETag-Header ein md5 vom Inhalt der gerenderten Datei darstellt, und ich somit leicht prüfen kann (mit der Funktion file_get_contents() ).

Das Hilft mir aber weiterhin nicht, eine vernünftige Lifetime einzugrenzen für OnExpire und ob OnDemand überhaupt sinnvoll ist sowie ob es sinnvoll ist, nur Teile der Seite zu Cachen.
 
Du meinst nach einer bestimmten Aktion (neue News posten)?

Ja, das ist ja die Frage, die ich mir derzeit noch stelle. Nachteil ist, dass es pro Projekt dann natürlich ein größerer Aufwand wäre anstatt einmal pro Seite die 2 Parameter zu setzen für das Caching selbst (bool, dauer) bzw. je nachdem wie ich die Klasse einbinden werde (wahrscheinlich mach ich das in der Art "class Template extends Caching") würde ich den Parameter "Dauer" in die config eintragen und nur wenn nicht gecacht werden soll die Methode NoChaching() aufrufen.

Ich find eigentlich das Modell alle x Sekunden das Template neu erstellen insgesamt praktischer, da man es ohne große Änderungen für mehrere Projekte nutzen kann (aus meiner jetzigen Sicht zumindest). Nur was wäre da ein guter Wert? 30 Sekunden? 60 Sekunden? Größer oder niedriger?
 
Du solltest zwischen den beiden „Caching-Ebenen“ (HTTP- und serverseitiges Caching) unterscheiden. Denn HTTP-Caching gilt nur für die gesamte HTTP-Antwort (Header und Nutzlast) während mit serverseitigem Caching auch nur einzelne Teile im Cache gespeichert werden können.
 
Zurück