Gunther: / (APACHE) Caching von Seiten - wann und wie?

Beitrag lesen

Hi,

auch dir erstmal schon vielen Dank für deine Ausführungen.

»» Im Zusammenhang mit der Überlegung für den Aufbau eines kleinen "Mini-CMS" für meine kleine private Homapage (lose Artikelsammlung), stehe ich (persönlich erstmals) vor der Frage, wie man ggf. einen "Caching-Mechanismus" am besten/ sinnvollsten realisiert, bzw. ob sich der Aufwand für kleine Sites überhaupt lohnt?

Da kann ich dir Smarty empfehlen, dass bringt den Caching-Mechanismus von Haus aus mit (und ein Effektives dazu).

Eine Anmerkung vorweg zu Smarty:
Aus meiner Sicht (die eines ambitionierten Laiens ~ "Hobbybastler") ist Smarty der absolute "Overkill". Smarty ist sicherlich eine der umfangreichsten und besten Template-Engines, die es derzeit gibt. Aber genau das ist auch das Problem daran. Um so ein (relativ kleines) Vorhaben umsetzen zu können, muss ich schon

  • (X)HTML
  • CSS
  • Javascript
  • PHP
  • MySQL
  • Apache (Module + Konfiguration)
    einigermaßen "beherrschen", bzw. mich damit auskennen. Von daher habe ich mich bis jetzt strikt geweigert. mich zusätzlich auch noch mit einer so umfangreichen Template-Engine auseinanderzusetzen, von der ich im Endeffekt nachher nur einen Bruchteil tatsächlich verwende. Zumal ich ja auch nur eine Anwendung für meinen eigenen Gebrauch erstellen will, und nicht ein Script, dass andere User verwenden können/ sollen und dort ggf. umfangreiche Template Änderungen/ Anpassungen vornehmen können sollen.

Smarty legt eine kopie von den erzeugten Ressourcen in ein Cache-Verzeichnis und liefert die Seiten nach dem Cachen aus diesem Verzeichnis, sprich die Inhalte werden nur einmal geparst und gespeichert.

OK, das entspricht ja in soweit dem Vorschlag von eddi.

Zu dem kommt, dass Smarty auch bei bereits besuchten Seiten die richtigen Header, in dem Fall 304 Not Modified mitsendet, so dass diese Seiten aus dem Browsercache geladen werden können.

Prinzipiell klar. Ich frage mich nur gerade, woher der Server weiß, dass die Seite bereits besucht wurde?

»» Welche Dinge kann/ sollte man grundsätzlich besser nie cachen?

Dynamische Seiten, Bspw. Seiten mit einer Kommentarfunktion oder Gästebücher.
Wobei man hier unterscheiden muss; wenn der User nur lesend unterwegs ist, kann er die Inhalte aus dem Cache haben, wenn er einen Beitrag schreiben möchte, muss dass Caching deaktiviert werden.

OK.

»» Und wie schließt man diese dann davon aus?

Mit Smarty:

/*

  • Wenn User was schreiben möchte oder eingelogged, nicht cachen
    */
      if (isset($_GET['write']) OR isset($_logged))
      {
        $smarty->caching = false;
      }
      else
      {
        $smarty->caching = true;
        $smarty->cache_lifetime = 18000;  // bei mir auf 5 Stunden
        $smarty->compile_check = false;
        $smarty->force_compile = false;
        $smarty->cache_modified_check = 1;
      }

$smarty->display('my.tpl', $_SERVER['REQUEST_URI']);


>   
> Wenn ein neuer Beitrag geschrieben wurde, muss dass Cache-Verzeichnis gelöscht werden, ansonsten wird der Beitrag erst in der Seite erscheinen, wenn cache\_lifetime abgelaufen ist.  

Auch klar soweit. Das kann man ja problemlos auch ohne Smarty quasi "nachbauen".  
  

> »» Ob für einen rein lesenden Zugriff überhaupt eine Session angelegt werden soll, weiß ich noch nicht. Vermutlich aber schon.  
>   
> Für nur lesenden Zugriff würde ich das Caching bevorzugen, einmal deinem Traffic, zum anderen deinen Usern zuliebe, da Ressourcen nicht immer wieder geladen werden müssen und die Seiten zum Teil schneller ausgeliefert werden.  

Hmmm ..., was mir bis jetzt immer noch nicht klar ist, ist der Punkt mit der Session.  
Die Verwendung einer Session schließt doch die Auslieferung einer statischen Version meines Dokuments nicht aus, oder?  
  

> »» Ein Login dürfte höchstwahrscheinlich u.a. für die Kommentarfunktion von Nöten sein. Je nach Seite dürfte es aller Wahrscheinlichkeit nach angepasste (dynamische) (Unter-)Menüs geben.  
>   
> Wie gesagt, Login und Generell Seiten, die durch die User in irgendeiner Form verändert werden können, wird das Caching nicht funktionieren.  
  

> Wobei Smarty auch für diesen Fall [einige Funktionen](http://www.smarty.net/manual/de/caching.cacheable.php) mitbringt, wie Bspw. Blockweise Cachen, und teile der Seite Dynamisch halten (nur wird das dann mit den Session wieder schwierig).  

Ja, das klingt doch zumindest sehr plausibel. So könnte ich also bspw. den eigentlichen Artikel aus dem (statischen) Cache holen, und bspw. nur den Kommentar-Teil dynamisch generieren und beides zusammenbauen und ausliefern.  
  
Und bezüglich zwischenzeitlicher Aktualisierungen muss ich mir nochmal die von Eddi genannten Header Angaben (ETag, If-Match, If-Modified-Since und If-None-Match) angucken. Das habe ich noch nicht 100%ig verstanden - scheint mir aber eine mögliche Lösung für das Problem "wurde die Datei zwischenzeitlich geändert oder nicht?" zu sein.  
  
Gruß Gunther