Performance der Webseite optimieren

Dieser Artikel beschreibt mehrere Möglichkeiten, wie Sie die Performance der Webseite Schritt für
Schritt optimieren können und worauf Sie zu achten haben.

Dieser Artikel beschreibt die Möglichkeiten, die Ihnen zur Verfügung stehen, um die Performance deutlich zu erhöhen. Es wird aufgezeigt, welche Auswirkung die Optimierungen haben und in welchem Fall diese überhaupt sinnvoll sind. 

Nicht jede Optimierung ist immer sinnvoll und nicht jeder Aufwand immer gerechtfertigt. Oft lassen sich allerdings enorme Performance-Verbesserungen bei geringem Aufwand erreichen und so Webserver, Netzwerke und Endgeräte entlasten.

Dieser Artikel betrachtet die folgenden drei Bereiche der Performance-Optimierung:

1. Reduzierung der PHP Skriptlaufzeit

Hierbei handelt es sich um die grundlegendste und offensichtlichste Optimierungsmöglichkeit. Es geht darum, die generierten PHP-Seiten möglichst schnell auszuliefern und somit die Serverlast zu reduzieren. 

Diese Optimierungen führen zu grundsätzlich schnelleren Ladezeiten. Außerdem kann dadurch ggf. eine teurere Server-Hardware gespart werden.

Optimierungen und deren Auswirkungen auf einem Testsystem

Dieser Test soll Ihnen verdeutlichen, welche Auswirkungen die verschiedenen Optimierungen auf die Skriptlaufzeit einer beispielhaften Seite haben.

Eingesetztes System

  • Domainfactory myHome Basispaket ohne eAccelerator

Aufgerufene Seite:

  • 100 Navigationpunkte auf drei Navigationen verteilt
  • Liste mit 10 aus 1000 Einträgen
  • 10 skalierte Bilder
  • 3 eingebundene Inhaltsbereiche

Folgende Optimierungen wurden betrachtet:

  1. Optimierungen im Template
    - Attribut expires bei Navigationsaufrufen auf 1800 gesetzt
    - Attribut useIndex beim Einbinden von XSLT-Templates auf 1 gesetzt
    - nicht genutzte Elemente- und Objekt-Templates entfernt
  2. Einsatz des GRID Caches
    - Gültigkeit auf 1800 gesetzt
  3. Einsatz des GRID Caches mit Optimierung der pre.php Steuerungsdatei
    - Statt auf Variablen zuzugreifen, wurden Konstanten gesetzt.
Skriptlaufzeit pro Seitenaufruf in Millisekunden
Skriptlaufzeit pro Seitenaufruf in Millisekunden

Es zeigt sich, dass bereits wenige Optimierungen, welche die Aktualität einer Seite geringfügig beeinflussen deutliche Geschwindigkeitsvorteile bringen. 

Der GRID Cache ist dann notwendig, wenn eine sehr hohe Anzahl an Zugriffen stattfindet. In Kombination mit dem eAccelerator kann so die Skriptlaufzeit selbst bei einem leistungsschwachen Serversystem auf unter 3 Millisekunden reduziert werden. 

Je höher die Zugriffszahl, desto kürzer kann auch die Cache-Gültigkeit eingestellt werden, da das Verhältnis von statischen zu generierten Seitenaufrufen proportional zur Anzahl der Zugriffe pro Sekunde steigt. 

Neben dem klassichen GRID Cache können Sie auch bei Navigationen eine Gültigkeit über das Attribut expires angeben. Innerhalb dieses Gültigkeitszeitraums werden die Navigationen für nicht eingeloggte Benutzer gecached. Des Weiteren kann über das Attribut deep bei Navigationen definiert werden, wie viele Level zu berücksichtigen sind.

Falls Sie die Möglichkeit haben, den eAccelerator zu nutzen, erreichen Sie dadurch neben einer grundsätzlichen Beschleunigung der Skripte auch eine deutliche Reduzierung des Speicherverbrauchs.

2. Reduzierung der Anfragen

Bei der Reduzierung der Skriptlaufzeiten haben wir uns um die PHP-Dateien gekümmert. Pro PHP-Datei werden allerdings fasst immer mehrere Bilder, CSS und JavaScript Dateien ausgeliefert. Inzwischen kommt es nicht selten vor, dass Projekte neben den eigentlichen JavaScript-Dateien nochmal fünf oder mehr JQuery-Erweiterungen laden, um so mit allen Effekten gerüstet zu sein. Wenn dann noch eine Bildnavigation geladen wird, kommt man mit den Bildern der Seite und den CSS-Dateien schnell auf 30 Anfragen pro PHP-Seite. 

Auch wenn jede dieser Anfragen im Vergleich zu den PHP-Skripten praktisch keine Serverlast verursacht, so können diese in der Summe dennoch einen Webserver stark belasten. Natürlich gibt es die Möglichkeit, dynamische und statische Inhalte über getrennte Server auszuliefern, und diese auf die jeweiligen Anfragen zu optimieren. Grundsätzlich sollte allerdings angestrebt werden, die Anzahl der Anfragen zu reduzieren. 

Browser Cache nutzen

Wenn man bedenkt, dass sich CSS, JS und Bilddateien nur selten ändern, ist es nahe liegend, diese nicht bei jedem Seitenaufruf vom Browser laden zu lassen. 

Hierfür gibt es mehrere Ansätze:

1. Ansatz: Der Browser bekommt bei jeder Anfrage mitgeteilt, ob sich eine Datei geändert hat und ruft nur dann den Inhalt ab. Diese Variante reduziert die Übertragung bei jeder Anfrage deutlich, da nur eine Head-Anfrage gemacht werden muss. Allerdings reduziert sich die Anzahl der Anfragen nicht. 

2. Ansatz: Der Browser bekommt über das Apache Modul mod_expires im Header mitgeteilt, dass eine Datei bis zu einem in ferner Zukunft liegenden Datum gültig ist, und ruft diese auch erst erneut ab, wenn dieses Datum eingetroffen ist. Hierdurch wird die Anzahl der Anfragen enorm reduziert. Zwischenzeitlich gemachte Änderungen werden allerdings erst angezeigt, nachdem der Benutzer ein Neuladen erzwingt. Abhilfe ist möglich, indem der Dateiname einen Zeitstempel enthält, so dass bei jeder Änderung eine neue Datei ausgeliefert wird, die der Browser auf jeden Fall lädt.

3. Ansatz: Der Browser bekommt eine Gültigkeitsdauer von wenigen Minuten übermittelt, die mit 30 Minuten z.B. weit über der durchschnittlichen Besuchsdauer liegt, sodass die statischen Dateien pro Besuch nur einmal abgerufen werden müssen. Dieser Ansatz ist zwar nicht ganz so effizient wie Ansatz 2 mit Zeitstempel, führt allerdings bereits zu einer enormen Reduzierung der Anfragen und ist praktisch immer einsetzbar, weshalb er auch im Beispielprojekt so standardmäßig eingesetzt wird.

Weniger Dateien ausliefern

Allein die Anzahl der Anfragen hat einen Einfluss auf die Performance einer Webseite. Betrachten wir mal die benötigen JavaScript-Dateien, so gilt:

  • Ein kleines eingebettetes JavaScript ist besser als eine externe JavaSript-Datei
  • Eine große externe JavaScript-Datei ist besser als zwei mittlere externe JavaScript-Dateien.

Dass keine JavaScript-Dateien geladen werden müssen, ist relativ unwahrscheinlich. Es bietet sich deshalb an, die benötigten Dateien, seien es JavaScript-Dateien oder CSS-Dateien jeweils in einer einzigen Datei auszuliefern. Genau wie mehrere kleine Bilder über Sprites in einem einzigen Bild ausgeliefert werden, können Sie dies auch mit JavaScript- und CSS-Dateien machen.

Dazu müssen Sie lediglich das Attribut merge="1" setzen, damit alle registrierten JavaScript- bzw. CSS-Dateien zusammengeführt ausgeliefert werden.

Auslieferung nur einer JavaScript und CSS-Datei in zusammengeführter Form

<wsl:includeCssRessources merge="1" dirMerged="/wGlobalProject/wGlobal/layout/styles/merged" minimize="0"/>   
<wsl:includeJsRessources merge="1" dirMerged="/wGlobalProject/wGlobal/layout/scripts/merged" minimize="0"/> 

3. Reduzierung der zu übertragenden Datenmenge

Nachdem nun die Skripte schneller sind und nur noch wenige Dateien ausgeliefert werden, können Sie die Performance noch weiter optimieren, indem Sie generell weniger Inhalte übermitteln. 

  • Skripte werden, falls vom eingesetzten Browser unterstützt, bereits im Standard komprimiert ausgeliefert. 
  • JavaScript- und CSS-Dateien werden im Standardprojekt komprimiert ausgeliefert, sofern dies vom Webserver über das Apache-Modul mod_deflate unterstützt wird. 
  • Die Bildkomprimierung ist auf 80% Qualität voreingestellt und kann je nach Bedarf noch erhöht werden.

Allein diese Einstellungen reduzieren die Datenübertragung in der Praxis um bis zu 90%. Zusätzlich können die eingebundenen und über merge="1" zusammengeführten JavaScript- sowie CSS-Dateien über das Attribut minimize="1" auch noch zusätzlich minimiert werden, um die Datenübertragung nochmals geringfügig zu reduzieren.

Zum Reduzieren der übertragenden Datenmenge gehört auch das Blockieren von unerwünschten Aufrufen (siehe weiterführende Links).

FAQs are only visible for Weblication ai search and editors!
Warum ist die Reduzierung der PHP-Skriptlaufzeit ein zentraler Hebel für bessere Webseit-Performance?
Weil die generierten PHP-Seiten dadurch schneller ausgeliefert werden. Das senkt die Serverlast und kann zu schnelleren Ladezeiten führen. Zudem kann unter Umständen teurere Server-Hardware eingespart werden.
Welche Optimierungen können die PHP-Skriptlaufzeit konkret senken?
Beispiele aus dem Artikel sind: - Caching- und Ablaufzeiten (z. B. <code class="codeInline">expires</code> für Navigationen auf 1800 setzen) - <code class="codeInline">useIndex</code> beim Einbinden von XSLT-Templates auf 1 setzen - nicht genutzte Elemente- und Objekt-Templates entfernen - GRID-Cache nutzen (Gültigkeit z. B. auf 1800 setzen) - GRID-Cache mit Optimierung der Steuerungsdatei (<code class="codeInline">pre.php</code>) verbessern, indem statt auf Variablen auf Konstanten zugegriffen wird.
Wann ist der GRID Cache sinnvoll?
Der GRID Cache ist besonders dann notwendig bzw. vorteilhaft, wenn eine sehr hohe Anzahl an Zugriffen stattfindet. Je höher die Zugriffszahl, desto kürzer kann die Cache-Gültigkeit gewählt werden.
Wie stark kann die Skriptlaufzeit durch Cache- und Beschleunigungsmaßnahmen sinken?
Im Testsystem wird beschrieben, dass in Kombination mit dem eAccelerator die Skriptlaufzeit selbst bei einem leistungsschwachen Serversystem auf unter 3 Millisekunden reduziert werden kann.
Wie unterstützen Navigationen mit Caching die Performance?
Für Navigationen kann eine Gültigkeit über das Attribut <code class="codeInline">expires</code> gesetzt werden. Innerhalb dieses Zeitraums werden Navigationen für nicht eingeloggte Benutzer gecached. Zusätzlich kann über das Attribut <code class="codeInline">deep</code> definiert werden, wie viele Level der Navigation berücksichtigt werden.
Welche Rolle spielt die Anzahl der Anfragen für die Performance einer Webseite?
Auch wenn einzelne Anfragen (z. B. für Bilder, CSS und JavaScript) im Vergleich zu PHP-Skripten kaum Serverlast erzeugen, kann die Summe über viele Dateien einen Webserver stark belasten. Daher sollte die Anzahl der Anfragen reduziert werden.
Welche Ansätze gibt es, um Browser-Caching für CSS/JS/Bilder zu nutzen?
Der Artikel nennt drei Ansätze: 1) Browser wird bei jeder Anfrage informiert, ob sich die Datei geändert hat (nur Head-Anfrage; weniger Daten, aber Anzahl der Anfragen bleibt). 2) <code class="codeInline">mod_expires</code> nutzt ein weit in die Zukunft liegendes Datum, wodurch die Anzahl der Anfragen stark sinkt (Änderungen erscheinen erst nach erzwungenem Reload; Lösung: Zeitstempel im Dateinamen). 3) Gültigkeitsdauer für wenige Minuten (z. B. 30 Minuten), sodass statische Dateien pro Besuch nur einmal abgerufen werden (praktisch immer einsetzbar; im Beispielprojekt standardmäßig).
Was bedeutet „Weniger Dateien ausliefern“ in Bezug auf JavaScript und CSS?
Die Idee ist, die Anzahl der geladenen Ressourcen zu reduzieren. Statt mehrere kleine Dateien zu laden, sollten die benötigten JS- bzw. CSS-Dateien in jeweils einer einzigen Datei ausgeliefert werden (ähnlich wie Bild-Sprites mehrere Bilder in einem Bild bündeln).
Wie kann man JavaScript- und CSS-Dateien zusammenführen (merge)?
Im Artikel wird empfohlen, das Attribut <code class="codeInline">merge="1"</code> zu setzen, damit alle registrierten JavaScript- bzw. CSS-Dateien zusammengeführt ausgeliefert werden. Beispielaufrufe werden zudem genannt (für CSS und JS mit <code class="codeInline">merge="1"</code> und Zielordnern für die gemergten Dateien).
Wie reduziert das Zusammenführen die Anzahl der Anfragen?
Wenn statt vieler externer JS- oder CSS-Dateien nur noch jeweils eine zusammengeführte Datei geladen wird, sinkt die Anzahl der HTTP-Anfragen deutlich. Das entlastet den Webserver zusätzlich zur verkürzten PHP-Skriptlaufzeit.
Wie kann die übertragene Datenmenge weiter reduziert werden, nachdem Scripte schneller sind?
Durch Kompression und Minimierung: - Skripte werden (falls vom Browser unterstützt) bereits im Standard komprimiert ausgeliefert. - JavaScript- und CSS-Dateien werden im Projekt komprimiert ausgeliefert, sofern das Apache-Modul <code class="codeInline">mod_deflate</code> unterstützt. - Bildkomprimierung ist auf 80% Qualität voreingestellt (kann bei Bedarf erhöht werden). Zusätzlich können zusammengeführte JS/CSS-Dateien mit <code class="codeInline">minimize="1"</code> zusätzlich minimiert werden.
Wie viel Datenübertragung kann durch diese Einstellungen typischerweise reduziert werden?
Der Artikel nennt Einsparungen „in der Praxis“ von bis zu 90% allein durch Kompressions- und Standard-Einstellungen. Durch zusätzliche Minimierung (z. B. <code class="codeInline">minimize="1"</code>) kann die Datenübertragung nochmals weiter reduziert werden.
Sollte man auch unerwünschte Aufrufe blockieren, um Daten zu sparen?
Ja. Das Blockieren unerwünschter Aufrufe wird dem Kontext „Reduzierung der zu übertragenden Datenmenge“ zugeordnet (Details sind als weiterführender Hinweis über „weiterführende Links“ im Artikel verortet).
Welche Optimierungen sind laut Artikel besonders lohnend, und warum nicht jede Maßnahme immer?
Nicht jede Optimierung ist stets sinnvoll und nicht jeder Aufwand immer gerechtfertigt. Gleichzeitig zeigt der Artikel, dass oft erhebliche Performance-Verbesserungen mit geringem Aufwand möglich sind, die Webserver, Netzwerke und Endgeräte entlasten. Maßgeblich ist, welche Auswirkungen die Optimierungen im konkreten Setup (Zugriffszahlen, Aktualität der Inhalte) haben.