PHP Seiten cachen

  • Ersteller Ersteller omaliesschen
  • Erstellt am Erstellt am
O

omaliesschen

Gast
Hi,

wie cached man Seiten richtig um sie schneller laden zu können? Anstatt für jede Anfrage die DB zu kontaktieren würde ich die Seiten gerne als html Dateien ablegen.

Beispiel an einem Forum.
Angenommen man hat ein Topic mit 200 Kommentaren. Pro Seite werden 20 Kommentare angezeigt.

Weiß jemand wie man das umsetzt? Wird alles in eine html geschrieben oder schreibt man für jeden Block aus 20 Kommentaren eine eigene Datei? Was wenn man ein Kommentar löscht? Alles neu schreiben?

Links zum Thema wären schon hilfreich.
 
Nun, es gibt verschiedene Herangehensweisen an das Caching von Webseiten.

Mein Vorredner hat die erste Möglichkeit bereits angesprochen. Varnish (und andere Caching-Proxies) werden vor den HTTP-Server geschaltet und cachen je nach Konfiguration mehr oder weniger der dynamisch generierten Webseiten. Das funktioniert auch mit dynamischen Webseiten wie dem von dir angesprochenen Forum, allerdings ist das wesentlich komplizierter. Wenn man eine Webseite mit einem Loginsystem verwendet, müssen Inhalte für jeden Nutzer einzeln gecached werden. Das ist natürlich sehr ineffektiv - weil viele Seiten beim ersten Aufruf einer Seite für den jeweiligen Nutzer noch nicht gecached ist - und ist zudem in der Praxis kaum einzusetzen, weil es sehr speicherintensiv ist. Alternativ kann man mit Varnish auch Inhalte für eingeloggte Nutzer cachen, dazu muss aber in die HTML-Ausgabe der dynamischen Webseite eingegriffen werden. In der Praxis kann das einen hohen Mehraufwand bedeuten, weil man zum Beispiel ein komplexes Forenscript an den Proxy-Cache anpassen muss.

Als nächste Möglichkeit gibt es auch PHP-Beschleuniger - ich gehe mal davon aus, dass diese Skript-Sprache verwendet wird - mit denen man die Ausführung teilweise deutlich beschleunigen kann. Ungleich der im ersten Absatz beschriebenen Proxy-Caches werden vom PHP-Beschleuniger die bereits kompilierten PHP-Skripte im Speicher gehalten, aber auch häufig genutzte Datenbankabfragen können so im Speicher gehalten werden. Diese Methode funktioniert deswegen sehr gut, weil ein PHP-Skript normalerweise bei jeder Ausführung durch einen Interpreter laufen muss. Weil das vergleichsweise langsam und ineffizient ist (schließlich ändert sich der Inhalt der PHP-Dateien nur sehr selten), kann man mit dieser Methode oft deutliche Vorteile erzielen.

Beide Lösungen setzen aber vollen Zugriff auf den Server voraus, denn entweder laufen diese Programme als Modul/Erweiterung von Apache beziehungsweise PHP (oder einem anderen Skriptinterpreters) oder als eigenständige Anwendung.

Abschließend möchte ich deswegen noch einen weiteren Weg erwähnen, der auch auf Shared Webspace funktioniert. Schließlich kann man das, was Varnish verspricht, auch selbst nachbauen. Natürlich ist eine PHP Cache Klasse (für erste Schritte wird ein Suchbegriff wie 'php cache class' ausreichend Resultate und Beispiele bringen) niemals so effizient wie die in den ersten beiden Absätzen erwähnten Methoden, in gewissen Situationen kann es aber sehr hilfreich sein - schon alleine deswegen, weil es auf solchem Webspace keine Alternative gibt.
 
Danke. Ich werd mir mal den phpbb cache ansehen und schaun wie die das regeln.

Im Grunde wird also nur die html Ausgabe abgefangen und in eine Datei geschrieben und bei erneutem request aufgerufen sofern die Datei existiert?

Wird generell alles abgefangen oder nur Teile?

Ab wievielen Nutzern wäre sowas sinnvoll bis notwendig?
 
omaliesschen schrieb:
Danke. Ich werd mir mal den phpbb cache ansehen und schaun wie die das regeln.

Im Grunde wird also nur die html Ausgabe abgefangen und in eine Datei geschrieben und bei erneutem request aufgerufen sofern die Datei existiert?

Wird generell alles abgefangen oder nur Teile?

Ab wievielen Nutzern wäre sowas sinnvoll bis notwendig?
Ja, schneller als nur das reine HTML zu liefern geht es, neben dem Setzen von Cache-Headern, eigentlich nicht mehr.
 
Das Problem ist wie vom Karol_ schon erwähnt das Userspezifische caching.

Wir vermutlich schwierig das 'ohne weiteres' umzusetzen.

Nutzerspezifischer Content müsste extra erzeugt werden. Geht aktuell leider nicht. Es könnten lediglich Teile der Seite gecached werden. Wobei auch hier wieder Probleme kommen da z.B. die Funktionalitäten der Beitragsverwaltung Post editieren/löschen etc. mit in der Ausgabe sind.

Kann mir nicht vorstellen wie man das in so viele kleine Teile zerlegen könnte um den Vorteil dabei auch nutzen zu können.

Bedeutet entweder für jeden Nutzer einen eigenen Cache und einen für Gäste oder gar nicht cachen?

Wenn dann ein Nutzer seinen Post editiert müssten alle betroffenen Cachefiles von allen Nutzern neu geschrieben werden???

Denke ich hab das noch nicht ganz korrekt verinnerlicht...
 
omaliesschen schrieb:
Danke. Ich werd mir mal den phpbb cache ansehen und schaun wie die das regeln.
Standardmäßig erstellt der phpBB-Cache Dateien, in denen die verschiedensten Inhalte (zum Beispiel dynamisch generierter PHP-Code mit Ergebnissen aus Datenbank-Abfragen) enthalten sind. Das ist bestimmt nicht die beste Lösung, weil man sich auf diese Weise aber viele Datenbankzugriffe sparen kann, wird diese Lösung trotzdem einen Vorteil haben. Optional kann die Board-Software auch mit PHP-Beschleunigern wie APC oder XCache arbeiten.

Über das 'memcache' PHP-Modul lässt sich phpBB sogar mit einem Memcached-Daemon verbinden. Diesen Vorteil wird man vollständig erst mit besonders großen Forensystemen ausspielen können, weil man diesen Memory-Cache auf einem eigenen physikalischen Server betreiben kann und somit die Last (auch ohne Load-Balancing) gut auf einen oder mehrere Web- und Cache-Server aufteilen kann.
 
In den meisten Fällen reicht eine Kombination aus aktivem OpCode - Cache für PHP (z.B. APC) und einem anständig großen Query Cache für die Datenbank. Dazu noch brauchbaren Code schreiben, und alles läuft.
 
Zurück
Oben