Template: Caching vs. Compiling
Günther S
- php
0 Jeena Paradies0 Cheatah
0 wahsaga0 Cheatah3 Sven Rautenberg
Hallo,
ich schreibe gerade ne eigene Template-Klasse in PHP und bin am überlegen, ob ich eine Klasse mit Caching oder Compiling schreiben soll.
Nur damit keine Missverständnisse auftreten:
Unter Caching verstehe ich, dass das Template einmal komplett geparst wird und der fertige HTML Code gespeichert und bei Bedarf abgerufen wird.
Unter Compiling verstehe ich das, was z.B. Smarty macht. Das Template wird in normalen PHP-Code "übersetzt", dieser PHP-Code gespeichert und dieser dann via include() eingebunden.
Eine Variante werde ich aus Performance-Gründen wohl auf alle Fälle verwenden, die Frage ist nur welche. Was könnt ihr mir empfehlen? Was ist tendenziell schneller?
Gruß,
Günther
Hallo,
Na Caching _muss_ ja schneller sein, da man den PHP-Interpreter gar nicht anwerfen muss.
Grüße
Jeena Paradies
Hi,
Na Caching _muss_ ja schneller sein, da man den PHP-Interpreter gar nicht anwerfen muss.
mit welcher Technik wird der Cache denn verwaltet?
Cheatah
Hallo,
mit welcher Technik wird der Cache denn verwaltet?
Wie meinst du jetzt Technik? Na mit dem Apache, der das dann ausliefert. Und verwaltet? Na wenn es neue Inhalte gibt wird halt durch, jo keine Ahnung, wohl PHP eine neue HTML Datei erstellt und auf der Festplattte des Servers abgelegt. Der Apache liefert das dann aus.
Das bischen Verweltung mit PHP fällt aber wohl kaum ins Gewicht.
Grüße
Jeena Paradies
Hi,
Das bischen Verweltung mit PHP fällt aber wohl kaum ins Gewicht.
Das ist wohl richtig. Aber es steht im Gegensatz zu Deiner vorherigen Aussage, der PHP-Interpreter müsse gar nicht mehr gestartet werden.
Cheatah
Hallo,
mit welcher Technik wird der Cache denn verwaltet?
Optional kann man natürlich auch mod_cache nutzen, was das für Technik ist bin ich mir nicht ganz sicher, wohl in C geschrieben aber mehr weiß ich nicht.
Grüße
Jeena Paradies
hi,
Unter Compiling verstehe ich das, was z.B. Smarty macht. Das Template wird in normalen PHP-Code "übersetzt", dieser PHP-Code gespeichert und dieser dann via include() eingebunden.
Wieso dann nicht gleich "normalen" PHP-Code schreiben?
gruß,
wahsaga
Hallo,
Wieso dann nicht gleich "normalen" PHP-Code schreiben?
Guter Einwand. Die Frage habe ich mir noch gar nicht gestellt.
Wahrscheinlich wollte ich immer etwas Abstand von PHP haben und den Template-Designern nur ein "beschnittenes" PHP geben (so dass sie nicht auf alle PHP-Funktion zugreifen können, sondern nur auf ein paar wenige Möglichkeiten von PHP (if, else, foreach und das war's auch schon ziemlich), die ich zur Verfügung stelle). Das zum einen.
Der Rest ist wohl persönlicher Geschmack. Ich mag das nicht, wenn man HTML- und PHP Code in dem Sinne gemischt hat. Mit dem Template-Skriptcode kann im HTML-Code kann ich mich eher anfreunden, vielleicht aus Gewohnheit.
Gruß,
Günther
Hallo Günther S,
Wahrscheinlich wollte ich immer etwas Abstand von PHP haben und den Template-Designern nur ein "beschnittenes" PHP geben (so dass sie nicht auf alle PHP-Funktion zugreifen können, sondern nur auf ein paar wenige Möglichkeiten von PHP (if, else, foreach und das war's auch schon ziemlich), die ich zur Verfügung stelle). Das zum einen.
Der Rest ist wohl persönlicher Geschmack. Ich mag das nicht, wenn man HTML- und PHP Code in dem Sinne gemischt hat. Mit dem Template-Skriptcode kann im HTML-Code kann ich mich eher anfreunden, vielleicht aus Gewohnheit.
Template-Engines haben nicht die Aufgabe, HTML-Code vom PHP-Code zu trennen.
Sie sollen Business-Logic von Presentation-Logic trennen.
Kann man hier schön nachlesen:
http://www.massassi.com/php/articles/template_engines/
http://www.phpguru.org/static/templating.html
MffG
EisFuX
Hi,
ich bleibe mal bei Deiner Terminologie.
Eine Variante werde ich aus Performance-Gründen wohl auf alle Fälle verwenden, die Frage ist nur welche. Was könnt ihr mir empfehlen? Was ist tendenziell schneller?
Ein Generator. Wenn Du keinerlei serverseitige Dynamik auf der Seite hast, reicht es völlig aus, die Seiten ein Mal als HTML-Dateien zu generieren und statisch abzuspeichern. Hast Du Dynamik, ist diese entweder durch individuelle Programmierung sehr viel effizienter durchzuführen, oder sie ist umfangreich genug, um ein Caching oder Compiling ad absurdum zu führen. Cachen kannst Du, wenn Du die Caching-Parameter genau kennst und bei neuen Parametern ein Kompilat vorliegen hast, mit dem Du einen neuen Cache-Eintrag erzeugen kannst.
Also: Die Frage ist nicht die nach "entweder oder", sondern die nach "entweder _und_, oder _nicht_".
Cheatah
Moin!
Eine Variante werde ich aus Performance-Gründen wohl auf alle Fälle verwenden, die Frage ist nur welche. Was könnt ihr mir empfehlen? Was ist tendenziell schneller?
Optimiere nichts, was du nicht messen kannst - das ist die allerwichtigste Regel.
Programmiere immer nur die einfachste Lösung - auch ziemlich bedeutend. Man kann jedes Problem beliebig kompliziert lösen, und man kann auch unendlich viele Features einbauen, die man "vielleicht mal irgendwann brauchen kann". Tu das nicht, programmiere, was aktuell benötigt wird. Denn wenn du was komplex-aufwendiges bräuchtest, würdest du ja schließlich Smarty nehmen und ggf. noch erweitern - und wärst hinsichtlich des Compilings jetzt schon fertig.
Und nur mal so zum Nachdenken: Wenn du einfach nur eine schlichte Template-Engine ohne Caching oder Compiling baust, hast du bei jedem Aufruf nur den Code für das Template-Umsetzen zu parsen. Wenn du Compiling und Caching einbaust, wird deine gesamte Engine aufwendiger zu parsen, kostet also so oder so mehr Zeit. Außerdem entstehen Caching- oder Compiling-Files nicht von alleine, und irgendwann muß entschieden werden, ob der ganze Vorgang neu durchgeführt werden muß, oder ob der Cache- bzw. Compilat-Inhalt noch geht.
Dieser Verwaltungsoverhead kann mit Pech aufwendiger werden, als wenn man ihn komplett wegläßt und einfach jedes Mal das Template neu parst. Deshalb: Erst einmal Messen können, wie aufwendig ein Vorgang eigentlich wirklich ist, ist unabdingbar.
Denn die Zeit ist nicht unbedingt der einzige Faktor bei einer Optimierung. Sie ist natürlich entscheidend, wenn du den einzelnen Request auf dem Server betrachtest. Aber was macht dein Gesamtsystem, wenn es unter Last kommt und mehrere tausend Requests pro Sekunde verarbeiten muß, mit mehreren hundert Prozessen parallel? Deine optimierte Version braucht dann vielleicht soviel mehr Speicher, dass der Server ständig swappen muß, und als Gesamtsystem viel langsamer wird.
- Sven Rautenberg
Hallo Sven,
vielen Dank für deine Ratschläge, werde ich mir zu Herzen nehmen!
Ich denke, ich werde zwei verschiedene Template-Klassen schreiben (bzw. das Caching- / Compiling via einem Setting ein-/abschaltbar machen) und das dann jeweils unter unterschiedlichen Serverlasten testen und dann projektabhängig entscheiden, ob mit oder ohne.
Denn die Zeit ist nicht unbedingt der einzige Faktor bei einer Optimierung. Sie ist natürlich entscheidend, wenn du den einzelnen Request auf dem Server betrachtest. Aber was macht dein Gesamtsystem, wenn es unter Last kommt und mehrere tausend Requests pro Sekunde verarbeiten muß, mit mehreren hundert Prozessen parallel? Deine optimierte Version braucht dann vielleicht soviel mehr Speicher, dass der Server ständig swappen muß, und als Gesamtsystem viel langsamer wird.
Dessen war ich mir noch gar nicht bewusst, nochmal danke ;)
Gruß,
Günther