Herr Bertling.

Musik. Politik. Dinge.

RSS-Feed

WordPress: Performance optimieren

WordPress-Installationen werden schnell „träge” – viele Datenbank-Abfragen & nach­läs­siges Coding in Themes führen zu lang­samem Sei­ten­aufbau. Dieses Pro­blem kann man auf viel­fäl­tige Art lösen. Dieser Bei­trag fasst einige Vor­schläge zusammen. Dabei geht es einer­seits darum, mit direkten Code-Veränderungen im jewei­ligen Theme Datenbank-Abfragen zu mini­mieren & den Code zu opti­mieren. Ande­rer­seits wird auch kurz auf einige sinn­volle Plugins eingegangen.

Gene­relles

Grund­sätz­lich sollte man natür­lich einige Punkte beachten, die keine Code-Veränderungen oder anderes benötigen:

  • Stets die aktu­ellste Word­Press–Ver­sion nutzen
  • Unnö­tige / unge­nutzte Plugins deak­ti­vieren oder besser noch löschen
  • Valide, gut gecodete Themes nutzen

Dar­über hinaus kann man aber noch wei­tere Maß­nahmen ergreifen:

Datenbank-Abfragen mini­mieren

Etliche Datenbank-Abfragen in ver­schie­denen Themes werden (selbst­ver­ständ­lich) durch PHP variabel gehalten. So ist garan­tiert, dass der ent­spre­chende Code mit dem jeweils rich­tigen Pfad aus­ge­stattet wird. Häufig genutzte Template-Tags sind:

bloginfo('name');
bloginfo('charset');
bloginfo('stylesheet_url');
bloginfo('rss2_url');

Den Groß­teil der Varia­blen findet man zumeist in der Datei header.php. Nun ist es ein Leichtes, diese Varia­blen nach der erfolg­rei­chen Instal­la­tion des jewei­ligen Themes durch sta­ti­schen HTML-Code zu ersetzen. Dazu lässt man sich den Quell­text (z.B.) der Start­seite des Blogs anzeigen. Dort wurden die Varia­blen natür­lich bereits in sta­ti­schen HTML-Code umge­formt, so dass dieser ein­fach aus dem Quell­text kopiert & im Theme ersetzt werden können. Laut Joost de Valk können dadurch bis zu elf Daten­bank­an­fragen ent­fernt werden – ziem­lich viel, oder? Nein, wie Frank Bültge in den Kom­men­taren anmerkt – die Daten werden gecacht, somit kann man sich das Rum­spielen im Theme sparen.

Übri­gens: Die Anzahl der Datenbank-Abfragen kann man sich direkt von Word­Press anzeigen lassen. Sinn­voll ist, diese Daten nur für Admi­nis­tra­toren anzeigen zu lassen. Fol­gender Code – etwa im Fuß­be­reich der Seite – macht das möglich:

<?php if (current_user_can('level_10')) {
	echo '<!-- '
	. get_num_queries()
	. ' Abfragen in '
	. timer_stop(0,3)
	. ' Sekunden -->';
} ?>

Flush early

Mit einem ein­fa­chen PHP-Befehl kann man bei der Gene­rie­rung des Themes schon mal den Head-Bereich der Seite raus­schi­cken, so dass sich der Browser schon mal um die dort ver­linkten Dateien „küm­mern” kann:

</head>
<?php flush(); ?>

Ob der Effekt in der header.php einen signi­fi­kanten Effekt hat oder besser in der index.php (o.Ä.) direkt hinter dem Aufruf der header.php plat­ziert werden sollte, kann ich leider nicht beur­teilen – happy tes­ting ;) Sinn­voll erscheint die Maß­nahme aber gene­rell schon.

All­ge­meine Code-Optimierung

Die Yahoo Performance-Guidelines fassen einige Maß­nahmen zur Performance-Optimierung zusammen:

  • HTTP-Requests mini­mieren
  • Style­s­heets im Kopf­be­reich der Seite
  • Javascript-Dateien im Fuß­be­reich der Seite
  • Alle Skripte & CSS-Dateien als externe Dateien einbinden
  • Skripte & Dateien zusammenfassen

Die prak­ti­sche FireBug–Erwei­te­rung YSlow schaut sich die in den Gui­de­lines ange­spro­chenen Punkte an & bewertet die Sei­ten­per­for­mance. Zur Ana­lyse in FireFox somit ein sehr gut geeig­netes Tool, um poten­ti­elle Performance-Bremsen aus­zu­ma­chen & zu entfernen.

Oft pas­siert es zudem, dass Plugins zusätz­li­chen Code in den Kopf– oder Fuß­be­reich der Seite ein­fügen. Das kann man über ein paar Zeilen Code in der functions.php unter­binden. Wie das funk­tio­niert, erklärt Justin Tad­lock. Für diese Maß­nahme ist einiges an Hand­ar­beit inklu­sive Code-Analyse der Plugins nötig – der Auf­wand lohnt aber, wenn statt meh­reren Style­s­heets etwa nur ein ein­ziges geladen werden muss.

Caching-Plugins

Einige der oben beschrie­benen Auf­gaben können auch Caching-Plugins über­nehmen. Recht bekannt & beliebt ist hier das Plugin WP Super Cache, das aus den auf­ge­ru­fenen Seiten regel­mäßig sta­ti­sche HTML-Seiten erstellt, so dass sämt­li­cher Datenbank-Stress ent­schärft wird. Dieses Plugin wird z.B. von Spree­blick eingesetzt.

Seit kurzem teste ich hier W3 Total Cache, das über die Mög­lich­keiten von WP Super Cache noch ein ganzes Stück hinaus geht – die recht beein­dru­ckende Liste der Nutzer hat mich neu­gierig gemacht. Über dieses Plugin lassen sich viel­fäl­tige Opti­mie­rungs­ein­stel­lungen vor­nehmen, die stark von den oben ange­spro­chenen Yahoo Performance-Guidelines beein­flusst sind. Dabei kann man etwa eine eigene Sub­do­main anlegen & als CDN nutzen. Nach einer inten­siven Dis­kus­sion zur Frage ob das lohnt, stellte Chris Coyier fest:

I think the general con­sensus is that YES, it is a good idea. If you can map the sub­do­main to a dif­fernet server ent­i­rely, one run­ning a stripped down web server with spe­cial set­tings and stuff (aggres­sive caching, cookie-less) OR you can map it to a bona­fied CDN, that’s cle­arly better.

However, just the sub­do­main all by itself seems like it has bene­fits enough that it is worth doing.

Die wei­teren Ein­stel­lungen sind sehr sehr umfang­reich & meist auch sehr sinn­voll, wes­halb ich das Plugin wärms­tens emp­fehlen kann.

Nach­trag: Jens ver­weist in den Kom­men­taren auf DB-Cachebesser, weil für WP 2.8 geschrieben: DB Cache reloaded, das zumin­dest im Ver­gleich zu WP Super Cache scheinbar etliche Vor­teile besitzt:

I think you’ve heard of WP-Cache or WP Super Cache, they are both top plugins for Word­Press, which make your site faster and responsive. Forget about them — with DB Cache your site will work much faster and will use less disk space for cached files. Your visi­tors will always get actual infor­ma­tion in side­bars and server CPU loads will be as low as posible.

Das werde ich mal testen & die von W3 Total Cache über­nom­menen Auf­gaben weit­ge­hend per Hand regeln – bei der Kom­pri­mie­rung der JavaScript-Dateien stellt sich das Plugin etwas sperrig an…

Fazit

Nach­trag (29.01.2010): Nach einigen Tests laufen hier (und auf diversen anderen „meiner” WP-Installationen) sowohl DB Cache reloaded als auch WP-SuperCache. Die beiden Plugins ergänzen sich dabei ganz gut – wäh­rend DB Cache reloaded wenn nötig die ein­zelnen Daten­bank­ab­fragen spei­chert,  legt WP-SuperCache direkt die kom­pletten Seiten auf dem Server als HTML-Image ab. Das geht natür­lich ent­spre­chend schneller, wenn einige Standard-Datenbank-Abfragen (wie etwa in der Sei­ten­leiste) bereits gespei­chert wurden und bei der nächsten auf­ge­ru­fenen Seite nicht mehr die Daten­bank / den Server belasten. Gutes Zusam­men­spiel also, das bei mir noch kei­nerlei Pro­bleme erzeugt hat.

Ich hoffe, dass ich einen halb­wegs voll­stän­digen & sinn­vollen Über­blick zur Opti­mie­rung von WordPress-Installationen geben konnte. Sollte ich etwas ver­gessen haben, in einem Punkt völlig daneben liegen oder alles super beschrieben haben, freue ich mich über jed­wedes Feed­back in den Kom­men­taren & Herzchen-Klicks ;)

Und jetzt: Viel Spaß beim Optimieren!

31.10.09

webdesign