Webseite langsam? Geschwindigkeit von PHP Skripten testen

Die Webseite lädt langsam? Es könnte an einem Skript liegen… Aber welches?

Wenn Sie zum Beispiel das Gefühl haben, dass eine bestimmte Funktion, eine spezielle Datenbankabfrage oder vielleicht ganz konkret ein bestimmtes WordPress Plugin zu langsam läuft, dann kann es durchaus mal sein, dass das an einem ungünstigen Loop liegt und/oder dass vielleicht zu viele (unnötige) Datenbankanfragen an den Webserver gestellt werden.

Bevor man aber loszieht und den vermeintlich langsamen Skripte mit dem Feuerschwert begegnet sollte man zunächst versuchen, die Ursache – die Bremse zu finden. Häufig reicht es dafür, einfach mal die Zeit zu stoppen, die ein bestimmtes Skript benötigt.

Dazu muss man lediglich vor Ausführung des verdächtigen Skripts eine Art Stoppuhr starten – wenn dann das Skript oder die Datenbankabfrage durchgelaufen ist schaut man einfach nach, wieviel Zeit vergangen ist. Und mit PHP ist es zum Glück auch relativ einfach, eine solche SToppuhr zu bauen und diese quasi um einen verdächtigen Code zu klammern – solange es sich eben um PHP Code handelt. Microtime ist Dein Freund!

Zunächst brauchen wir eine Variable für den Timer, der vor Ausführung des zu untersuchendes Codes gestartet wird:

$start_timer = microtime(true); // TIMER START

Dann wird der Timer gestoppt, sobald der Code durchgelaufen ist. Genau genommen wird hier einfach die Differenz zwischen START und STOPPin der Variable $time_passed gespeichert:

$time_passed = microtime(true) - $start_timer; // TIMER STOP

Man könnte den so errechneten Wert – also die Dauer über ein einfaches echo anzeigen lassen:

echo("Das Skript hat ".$time_passed." Sekunden benötigt.");

Wenn man dann noch den Wert auf zwei Kommastellen runden möchte, setzt man einfach die PHP Anweisung  round davor:

echo("Das Skript hat ".round($time_passed, 2)." Sekunden benötigt");

Alles zusammen genommen könnte am Ende dann ungefähr so aussehen:

$start_timer = microtime(true);

// hier folgt der verdächtige Code
while … {

}

$time_passed = microtime(true) - $start_timer;

echo("Das Skript hat ".round($time_passed, 2)." Sekunden benötigt.");

Nachtrag: Ob sich der Aufwand lohnt? Ist die Ladezeit überhaupt SEO-relevant? ist eine langsam ladende Seite schlecht für SEO? Und/oder ist eine langsame Webseite schlecht für UX? Alle diese Fragen können ganz klar mit JA beantwortet werden:

  • Ladezeit ist SEO-relevant
    Spätestens seit 2010 ist es offiziell: die Ladezeit einer Webseite beeinflusst neben vielen anderen Faktoren die Suchergebnisse-Position einer Webseite. Bereits 2009 hatte google ein Experiment durchgeführt, bei dem die Ladezeit der Suchergebnisseite künstlich verlangsamt wurde – und das Ergebnis war eindeutig: Ladezeit ist SEO-relevant.
  • Ladezeit ist UX-relevant
    Die oben genannten Untersuchung war im Prinzip ’natürlich‘ eine Untersuchung der User Experience. Wenn die Suchergebnisseite nur 100ms bis 400ms langsamer lädt, reduziert sich die Zahl der Suchanfragen um 0,2% bis 0,6% – die Nutzer verlieren mit abnehmender Geschwindigkeit die offenbar die Lust, die Seite zu benutzen.
  • Lohnt sich der Aufwand?
    Ich habe kürzlich für einen Kunden eine Seite optimiert, die man auch schon als WebApp bezeichnen kann. Kurz beschrieben: aus unterschiedlichen Datenbankabfragen wird je nach gesetzten Präferenzen und Optionen eine komplexe Tabelle generiert. Vor der Optimierung wurde jede Tabellenzelle bzw. die Ausgabe jeder Tabellenzelle über einen Loop einzeln generiert. Nach der Optimierung genügte eine einzige Datenbankabfrage. Wir darüberhinaus an verschiedenen Stellen im Skript die Zeit gemessen, die zum Beispiel zur Ausführung einer bestimmten Funktion benötigt wurde und anschliessend verschiedene Alternativen getestet. So konnten wir letztendlich die Zeit, die benötigt wird, um die Daten für die Tabelle zusammenzustellen von 5 – 10 Sekunden auf unter 0,5 Sekunden reduzieren. Ja: der Aufwand lohnt sich. Manchmal.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert