Performance-Optimierung von PHP-Anwendungen mit Xdebug

Wer schonmal wirklich(!) große Anwendungen in PHP geschrieben hat, ist vielleicht auch auf das Problem Performance gestoßen. Die Seite lädt viel zu lange und man findet einfach nicht heraus, woran es liegt oder an welcher Stelle man die Anwendung bzw. eine Funktion optimieren kann. In einer solchen Situation gibt es nur noch eine Möglichkeit: Profiling.

Was ist Profiling?

Beim Profiling wird ein „Profil“ der kompletten Anwenudng angelegt. In diesem Profil wird genau angezeigt, welche Funktionen wann und wo ausgeführt wurden, sobald die Anwendung aufgerufen wird. Im besten Fall erhält man dazu noch den aktuellen Speicherverbrauch und die Ausführungszeit der einzelnen Funktionen.
Um solch ein Profil zu erstellen, müssen wir natürlich nichts eigenes mehr schreiben, denn es gibt bereits diverse PHP-Extensions, die genau das können. Ich nutze Xdebug, weil es bei der Standardinstallation von XAMPP sofort mitgeliefert wird damit direkt einsatzbereit ist.

Erstellen eines Profils mit Xdebug

// Profiling starten. Es wird eine Datei "mein_profil.xt" angelegt.
xdebug_start_trace('mein_profil');
 
// Irgendwelche Funktionen
$array = array();
for($i = 0; $i < 5; $i++)
{
	array_push($array, sqrt(mt_rand()));
}
sort($array);
 
// Datei schreiben und Profiling beenden
xdebug_stop_trace();

Sollte es hier zu einer Fehlermeldung kommen, sollte die php.ini überprüft werden, ob die Xdebug-Extension aktiviert ist.

Das Skript erzeugt anschließend folgende (ähnliche) Ausgabe in der Datei mein_profil.xt:
1. Spalte: Vergangene Zeit, 2. Spalte: Speicherverbrauch, 3. Spalte: Funktionsaufruf

TRACE START [2010-05-10 18:34:35]
    0.0005     106184     -> mt_rand() /var/www/test.php:9
    0.0006     106256     -> sqrt() /var/www/test.php:9
    0.0006     106256     -> array_push() /var/www/test.php:9
    0.0006     106376     -> mt_rand() /var/www/test.php:9
    0.0006     106448     -> sqrt() /var/www/test.php:9
    0.0006     106448     -> array_push() /var/www/test.php:9
    0.0006     106568     -> mt_rand() /var/www/test.php:9
    0.0006     106640     -> sqrt() /var/www/test.php:9
    0.0006     106640     -> array_push() /var/www/test.php:9
    0.0006     106760     -> mt_rand() /var/www/test.php:9
    0.0006     106832     -> sqrt() /var/www/test.php:9
    0.0006     106832     -> array_push() /var/www/test.php:9
    0.0006     106952     -> mt_rand() /var/www/test.php:9
    0.0007     107024     -> sqrt() /var/www/test.php:9
    0.0007     107024     -> array_push() /var/www/test.php:9
    0.0007     107144     -> sort() /var/www/test.php:11
    0.0007     107144     -> xdebug_stop_trace() /var/www/test.php:14
    0.0007     107248
TRACE END   [2010-05-10 18:34:35]

Somit lässt sich selbst bei großen Skripts mit über 5000 Funktionsaufrufen leicht herausfinden, an welchen Stellen viel Zeit oder Arbeitsspeicher beansprucht wird. Und genau an diesen Stellen kann man dann auch anfangen, den Code zu optimieren.

Schreibe einen Kommentar

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