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.