Smarty vs PHP
Udo
- php
Hallo zusammen,
zur Zeit beschäftige ich mit der Trennung von Code u. Layout,
habe verschiedene Template-Engines ausprobiert u. auch deren
Performance getestet.
aufgefallen ist mir, das Smarty gegenüber einer PHP-Lösung
5 x langsamer ist
Beispiel:
Temlatelösung nur mit Php:
<?php
$navigation = "<ul>
<li>Seite 1</li>
<li>Seite 2</li>
<li>Seite 3</li>
<li>Seite 4</li>
</ul>
";
$title = "Templatetest mit Smarty u. PHP";
$content = "Lorem ipsum Lorem ipsum Lorem ipsum
Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
";
include("php.tpl.htm");
?>
das Template (php.tpl.htm):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?php print $title; ?></title>
</head>
<body>
<div id="navigation">
<?php print $navigation; ?>
</div>
<div id="content">
<h1><?php print $title; ?></h1>
<p><?php print $content; ?></p>
</div>
</body>
</html>
nun das gleiche mit Smarty:
<?php
require('Smarty.class.php');
$smarty = new Smarty;
// ... $smarty Konfiguration ...
$smarty->caching = TRUE;
$navigation = "<ul>
<li>Seite 1</li>
<li>Seite 2</li>
<li>Seite 3</li>
<li>Seite 4</li>
</ul>
";
$title = "Templatetest mit Smarty u. PHP";
$content = "Lorem ipsum Lorem ipsum Lorem ipsum
Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
";
$smarty->assign('navigation', $navigation);
$smarty->assign('title', $title);
$smarty->assign('content', $content);
$smarty->display('smarty.tpl.htm');
?>
das Smartytemplate lasse ich mal weg s.o
( anstatt <?php print $navigation; ?> {$navigation} )
zugegeben ist das Beispiel sehr simpel, in einer echten
Anwendung kommen dann noch Datenbankabfragen u. mehr dazu.
Ich hab allerdings meine Zweifel ob man durch das Caching
von Smarty die Zeit aufholen kann.
was meint Ihr ?
Grüße Udo
Ich grüsse den Cosmos,
aufgefallen ist mir, das Smarty gegenüber einer PHP-Lösung
5 x langsamer ist
Smarty _ist_ eine PHP-Lösung.
Und ja, Smarty ist langsamer, als ein hartcodiertes Template, da Smarty praktisch ein Parser und Interpreter ist.
Bei einem meiner Admintemplates dauert der Aufbau auf dem Testserver 10 Sekunden bei einer Quelltextgrösse von 195kb.
Bei Frontends ist der Geschwindigkeitsunterschied aber marginal und ob der Besuher die Seite eine Sekunde früher oder später kriegt, völlig egal. Bandbreitenschwankungen machen da grössere Unterschiede.
m.E. wiegen die Vorteile von Smarty (beim passenden Projekt) jeden Nachteil auf. Bei meinem CMS und einigen anderen Projekten rum um Webradios nutze ich nur Smarty, da die Syntax nicht zu schwer ist, der Server ohne besondere Installation auskommt (kein PEAR, wie bei meinen vorherigen Lösungen) und gepackte 160kb und entpackte 600kb keinen Webspace zum platzen bringen.
Die Debugfunktion ist absolut genial und die Möglichkeit, eigene Funktionen zu integrieren, macht Smarty zur eierlegenden Wollmilchsau mit Düsenantrieb ~g~
Wenn es nicht um jede Millisekunde ausführungszeit geht (dafür ist PHP sowieso ungeeignet), plädiere ich für Smarty.
Möge das "Self" mit euch sein
Hallo Manuel,
und ob der Besuher die Seite eine Sekunde früher oder später kriegt, völlig egal. Bandbreitenschwankungen machen da grössere Unterschiede.
Von wegen egal, eine Sekunde ist sehr viel, war für mich der
Hautgrund Yahoo durch Google zu ersetzen, als Google noch nicht so bekannt war.
Es gibt viele Seiten (Besonders Bilddatenbanken, die ich aufgrund
der Geschwindigkeit ungern nutze.
Gruss
Meike
Ich grüsse den Cosmos,
Von wegen egal, eine Sekunde ist sehr viel, war für mich der
Hautgrund Yahoo durch Google zu ersetzen, als Google noch nicht so bekannt war.
Aha. Du wechselst, weil der Seitenaufbau eine Sekunde länger dauert? Woher weisst du, was der Aufbau aufgrund des Servers länger dauert und nicht aufgrund anderer Faktoren, wie Leitungsgeschwindigkeit, Rechnerauslastung usw?
Es gibt viele Seiten (Besonders Bilddatenbanken, die ich aufgrund
der Geschwindigkeit ungern nutze.
Bei einer Sekunde unterschied? Sorry, aber entweder kannst du eine Sekunde nicht abschätzen oder du verwechselt eine Sekunde mit einer Minute.
Die Userseiten meines CMS haben eine Erstellungszeit auf dem Server von ca. 0.2 Sekunden. Im Browser erscheinen sie zwischen 2 und 30 Sekunden, je nach Inhalt und Auslastung meines Servers.
Wenn du jetzt also eine Bilddatenbank besuchst, die Bilder 30-60 Sekunden brauchen, bis sie auf deinem Rechner sind und du dann glaubst, eine Sekunde Rechenzeit (bei extrem komplexen Templates, bei einfache liegt die Ausführungszeit bei unter 0.1s) ist viel, ist das für mich Weltfremd und unrealistisch.
Möge das "Self" mit euch sein
Hallo,
also zu behaupten, dass im Web 1 Sekunde nichts ausmacht, ist
In groesseren Projekten gibt es meist extra ein Team von ein
paar Leuten welches sich ausgiebig um die Performance bemueht.
Denn die eine Sekunde vergroessert sich exponentiell mit der
Anzahl der simultanen Zugriffe -> Servelasten.
Bei einer kleinen Gabis-Kaffee-Klatsch-Homepage kann man das
wohl vernachlaessigen, bei Zugriffen >5000 die Stunde ist
es jedoch alles andere als "egal".
Mirko
Ich grüsse den Cosmos,
also zu behaupten, dass im Web 1 Sekunde nichts ausmacht, ist
- bei allem Respekt - absoluter Humbug.
Aha, ist das so?
In groesseren Projekten gibt es meist extra ein Team von ein
paar Leuten welches sich ausgiebig um die Performance bemueht.
Denn die eine Sekunde vergroessert sich exponentiell mit der
Anzahl der simultanen Zugriffe -> Servelasten.
Klar, und die setzen auch PHP und Smarty ein ....
Und die Serverlast hängt nicht von der Aufbauzeit sondern vom der Interpreterzeit ab. Du vergleichst Äpfel mit Birnen.
Bei einer kleinen Gabis-Kaffee-Klatsch-Homepage kann man das
wohl vernachlaessigen, bei Zugriffen >5000 die Stunde ist
es jedoch alles andere als "egal".
Ein Moped mit nem Ferrari zu vergleichen, nur um ein Argument zu finden, wieso es im Internet wichtig ist, eine Seite mit Smarty eine Sekunde schneller aufzubauen, ist - bei allem Respekt - schwachsinn.
Fruchtlose Diskussion, weil am Thema vorbei argumentiert wird.
Möge das "Self" mit euch sein
Guten Abend,
zuerst einmal eine Bemerkung zu deinem Posting - zwei Sachen sind mir dabei aufgefallen:
Zum einen: Du gehst bereits zu Beginn in die Rechtfertigungs- und Fingerzeig-Rolle ueber,
was mich darauf schliessen laesst, dass du dich a) persoenlich angegriffen oder b) durch
ein einfaches Posting bereits herausgefordert fuehlst oder c) einfach nur rumstaenkern
moechtest.
Und zum anderen wirfst Du mir eine "Fruchtlose Diskussion" vor - doch ist die Art deiner
Reaktion genau jenes Verhalten, welches Du augenscheinlich an mir kritisert hast.
Ist es nicht so, dass man bei anderen Leuten genau jene Sachen sieht und bemaengelt,
welche in einem selbst am staerksten vorhanden sind?
Bevor Du dich der rhetorische Frage annimmst gehe ich nun auf das von dir
Geschriebene ein:
In groesseren Projekten gibt es meist [...]
Klar, und die setzen auch PHP und Smarty ein ....
Du uebersiehst, dass es hierbei um die eine Sekunde im Web geht - und nicht um die
zugrunde liegende Serversprache.
Anzahl der simultanen Zugriffe -> Servelasten.
Und die Serverlast hängt nicht von der Aufbauzeit sondern vom der Interpreterzeit ab.
Ich sagte, dass eine hoehere Anzahl an Zugriffen die Serverlast erhoeht.
Und Du wirfst wir darauf hin vor, dass ich die Aufbau- und Interpreterzeit verwechsle.
Dazu kann ich dir direkt die folgende Zeile wiedergeben, denn ich kann sie nicht gebrauchen:
Du vergleichst Äpfel mit Birnen.
Bei einer kleinen Gabis-Kaffee-Klatsch-Homepage kann man das
wohl vernachlaessigen, bei Zugriffen >5000 die Stunde ist
es jedoch alles andere als "egal".Ein Moped mit nem Ferrari zu vergleichen, nur um ein Argument zu finden, wieso es im
Internet wichtig ist, eine Seite mit Smarty eine Sekunde schneller aufzubauen, ist -
bei allem Respekt - schwachsinn.
An dieser Stelle verweise ich nochmal auf deine, von mir am Anfang bereits erwaehnte,
(Re)aktion in deinem Posting.
a) die von mir angegebene Anzahl an Zugriffen ist doch keine Ferrari! Ich bitte dich..
b) ich bleibe dabei: 1 Sekunden im Web ist signifikant. Sowohl eine an sich, als auch
die Addition. Denn aus einer Sekunde wird nach ein paar Erweiterungen schnell zwei, aus
zwei dann drei usw. usf.
c) Bezgl. Smarty und das nicht-verstehen-wollen deinerseits, dass es um die benoetigte
Zeit _unabhaengig_ von der zugrunde liegenden Sprache ging und eben nicht um Smarty als
solches - mal wieder einen Satz den Du von mir liebevoll zurueckbeckommst:
[..] am Thema vorbei argumentiert wird.
Ich wuensche Dir noch einen angenehmen Sonntag
Mirko
(Hallo|Hi(ho)|Tag) Manuel B.,
Und ja, Smarty ist langsamer, als ein hartcodiertes Template, da Smarty praktisch ein Parser und Interpreter ist.
Das ist PHP auch. Alles, was Smarty kann, kann PHP auch. Wenn ich mich nicht irre, wurde es extra dazu entworfen, um "Hypertext" zu "parsen" und zu "interpretiere". Es hat eine Unmenge an leistungsfähigen Funktionen, um Texte zu verarbeiten, Muster zu suchen und zu ersetzen. Wozu also in einer interpretierten Skriptsprache einen Interpreter für eine weitere Skriptsprache schreiben, wenn man das Original benutzen kann?
m.E. wiegen die Vorteile von Smarty (beim passenden Projekt) jeden Nachteil auf. Bei meinem CMS und einigen anderen Projekten rum um Webradios nutze ich nur Smarty, da die Syntax nicht zu schwer ist, ...
Wenn man eh PHP beherrscht, warum sollte man extra eine zusätzliche Sprache lernen?
... der Server ohne besondere Installation auskommt (kein PEAR, wie bei meinen vorherigen Lösungen) ...
Auch darauf kann man mit reinem PHP verzichten.
Die Debugfunktion ist absolut genial und die Möglichkeit, eigene Funktionen zu integrieren, macht Smarty zur eierlegenden Wollmilchsau mit Düsenantrieb ~g~
"Nur-PHP" lässt sich ebenfalls um eigene Funktionen erweitern. Debugger gibts dafür auch.
Wenn es nicht um jede Millisekunde ausführungszeit geht (dafür ist PHP sowieso ungeeignet), plädiere ich für Smarty.
Kann man wirklich mit Smarty schneller ein "Layout" zusammenbasteln als mit PHP-Code? Wenn ja, dann nehme ich alles zurück. Wenn nicht, dann frage ich mich, warum man mit Smarty (und anderen umfangreichen "Template-Engines") auf PHP ein System draufsattelt, das im Prinzip das Gleiche leistet wie PHP. Es macht zumindest den Eindruck, als ob manche Webentwickler den Wald vor lauter Bäumen nicht mehr sehen.
http://www.phpguru.org/static/templating.html
http://www.massassi.com/php/articles/template_engines/
MffG
EisFuX
Ich grüsse den Cosmos,
Kann man wirklich mit Smarty schneller ein "Layout" zusammenbasteln als mit PHP-Code? Wenn ja, dann nehme ich alles zurück.
Ja, kann man. Jeder, der HTML kann, wird relativ problemlos ein Smarty-Template entwerden können, ohne auch nur Ansatzweise was mit PHP zu tun zu haben.
Wenn nicht, dann frage ich mich, warum man mit Smarty (und anderen umfangreichen "Template-Engines") auf PHP ein System draufsattelt, das im Prinzip das Gleiche leistet wie PHP. Es macht zumindest den Eindruck, als ob manche Webentwickler den Wald vor lauter Bäumen nicht mehr sehen.
Smarty leistet etwas völlig anderes. Und zwar die 100%ige Trennung von Code und Design. Und genau das ist der Sinn von Templateengines.
Abgesehen davon, das hartkodierte Templates wesentlich schwerer zu ändern sind (Von einem Nichtprogrammierer praktisch gar nicht) und ein Templatewechsel nicht einfach durch austauschen eine (Quasi)-HTML-Datei zu erreichen ist.
Und das Template-Engines ihre Bereichtigung haben, zeigen Projekte wie Joomla, die ohne Templateengine nicht mehr im Design anpassbar wären, da die Komplexität schlichtweg zu gross ist.
Möge das "Self" mit euch sein
Hallo,
http://www.phpguru.org/static/templating.html
http://www.massassi.com/php/articles/template_engines/
Mit beiden Ansätzen habe ich genau 2 Probleme:
* Beide setzen short_open_tag = On voraus, denn <?=$foo?> geht eben nur bei
aktiviertem short_open_tag. Wenn short_open_tag deaktiviert ist, muss ich
<?php echo $foo; ?> machen - was dann bei vielen Variablen schnell sehr
umständlich wird. short_open_tag kann man aber nicht voraussetzen, wenn
man portable Software schreiben will.
* Für einfache Variablen, die man nur ausgeben will, ist das sicherlich
ganz brauchbar zu nutzen. Allerdings sind Template-Engines wie z.B.
Smarty explizit als Template-Engines und eben *nicht* als Programmier-
sprache konzipiert worden. Ok, man kann auch Smarty-Templates schreiben,
in denen nur noch programmiert wird, die komplett unübersichtlich sind,
aber blödsinnigen Code kann man so ziemlich überall fabrizieren. Smarty
dagegen bietet eine Syntax an, die gerade auf Templates optimiert ist -
bei PHP ist das nicht so direkt der Fall. Mal ein paar Beispiele:
- Wenn ich in PHP eine Variable nochmal durch eine Funktion jagen
will, z.B. htmlspecialchars(), dann muss man sowas schreiben:
<?php echo htmlspecialchars ($variable); ?>
oder, bei short tags: <?=htmlspecialchars ($variable)?>
Das ist zwar prinzipiell kein Problem, aber macht den Code IMHO
schnell sehr übersichtlich, wenn dann auch noch andere Funktionen
dazukommen, z.B. nl2br:
<?php echo nl2br (htmlspecialchars ($variable)); ?>
(oder <?=nl2br (htmlspecialchars ($variable)); ?>)
In Smarty kann man dagegen schreiben:
{$variable|escape|nl2br}
Das ist für eine Template-Sprache (!) eine viel sinnvollere
Syntax - IMHO zumindest.
- Template-Engines nehmen einem auch eine ganze Menge Arbeit ab
und ermöglichen es, einem das Leben leichter zu machen. Bei
Smarty gibt's z.B. {html_options options=$Options selected=$sel}
erzeugt lauter <option value="KEY">VALUE</option> aus dem $Options
Array und selektiert automatisch KEY = $sel. Ferner gibt's so
nette Dinge wie {cycle}: Du willst z.B. jede zweite Tabellenzelle
andersfarbig ausgeben, weist ihnen also verschiedene Klassen zu.
Das kannst Du so machen, indem Du in die Schleife selbst einfach
<tr class="{cycle values="odd,even"}"> schreibst - Smarty
übernimmt dann den Rest für Dich. Ferner stehen Dir in Schleifen
eine ganze Menge Informationen über die Schleife selbst zur
Verfügung über spezielle Tags (ist dies das erste oder letzte
Element etc) - die Dir in PHP ohne Nacharbeit nicht zur Verfügung
stehen. Nur, um mal ein paar einfache Beispiele zu nennen.
Natürlich kannst Du _alles, was Du in Smarty kannst, auch in PHP
machen - allerdings nur dadurch, dass der Code *im Template*
wächst und bei komplexeren Dingen unübersichtlich wird. Ich
bezweifle gar nicht, dass einfaches PHP für *EINFACHE* Anwendungen
durchaus die bessere Alternative ist, da schlanker. Sobald das
ganze jedoch komplizierter wird, dann nehmen einem Template-
Engines eine *ganze* Menge Arbeit ab, entschlanken den Code und
führen dazu, dass man sich beim Schreiben der Templates auf das
wesentliche konzentrieren kann - und sich nicht mit Neben-
sächlichkeiten auseinandersetzen muss.
Zudem: Zumindest Smarty wandelt alle Templates in PHP um, und
bindet diese "kompilierten" Templates dann per include() ein -
damit ist der Geschwindigkeitsvorteil von reinem PHP praktisch
gleich Null, sobald die Templates mal kompiliert sind, denn
der Overhead durch Smarty selbst ist relativ gering.
Viele Grüße,
Christian
(Hallo|Hi(ho)|Tag) Udo,
Ich hab allerdings meine Zweifel ob man durch das Caching
von Smarty die Zeit aufholen kann.
Wenn Caching nicht hilft, sollte man über den Einsatz eines PHP-Accelerators nachdenken.
MffG
EisFuX