Beliebte Suchanfragen
|
//

Profiling von PHP Anwendungen

24.11.2008 | 2 Minuten Lesezeit

Wir bei codecentric haben nicht nur den Anspruch führend im Bereich Java Performance zu sein, sondern auch auf anderen Gebieten unseren Kunden mit Rat und Tat zur Seite zu stehen.

In einem früheren Eintrag habe ich schon einmal über einen Vergleich von PHP und Java geschrieben. Dabei habe ich unter anderem Tooling Probleme bei PHP bemängelt. In diesem Eintrag möchte ich deshalb darauf eingehen wie man PHP Anwendungen Profilen kann.

Für Java Entwickler sollte JProfiler ein Begriff sein. Das Äquivalent auf PHP Seite nennt sich Xdebug + CacheGrind. Xdebug ist dabei das Mittel um Skriptaufrufe zu profilen, WinCacheGrind nutzen wir dann anschließend um die gesammelten Daten auszuwerten. In diesem Beispiel profilen wir einen Kommandozeilen Aufruf des symfony Framworks . Da ich dort auch commiter bin nutze ich Xdebug dort häufiger um eine gute nichtfunktionale Qualität sicherzustellen.

Zuerst lädt man die ‚.dll‘ (oder ‚.so‘ für Linux) Extension von Xdebug herunter und legt sie zu den weiteren Extensions in das ‚php/ext‘ Verzeichnis. Um die Extension zu aktivieren muss man in der ‚php.ini‘ Xdebug einbinden und mitteilen wo es hin profilen soll:

1zend_extension_ts="d:\dev\php\ext\php_xdebug-2.0.3-5.2.5.dll"
2xdebug.profiler_output_dir="c:\xdebug-profiling"
3xdebug.profiler_enable=1

Es ist dabei darauf zu achten, daß diese Einstellungen in den richtigen ‚php.ini‘ Dateien gemacht werden. im PHP Verzeichnis findet sich die für die Kommandozeile, im Apache Verzeichnis üblicherweise die für den von Apache gestarteten PHP Prozess. Auch muss das angegebene Zielverzeichnis existieren, ansonsten werden keine Dateien abgelegt.

Als kurzer Test sollte ein Aufruf von ‚php -m‘ folgendes liefern:

1[Zend Modules]
2Xdebug

Als nächstes profilen wir einen Aufruf. Z.B. einen der symfony sandbox, zum generieren einer Anwendung:

1php symfony generate:app codecentric

In diesem Fall entsteht eine etwa 8MB große ‚cachegrind.out.4896‘. Dieses kann nun mit WinCacheGrind geladen werden. Dies sieht dann in etwa so aus:

Leider bietet WinCacheGrind nur begrenzte Funktionalität. KCacheGrind ist da schon etwas weiter, jedoch bei weitem noch nicht so ausgereift wie die häufig von uns eingesetzten Java Tools. Außerdem findet sich keine Memory Ansicht. Dies ist wohl auch darauf zurückzuführen, daß das Memory Management in PHP sehr dürftig ist. Brauchbar ist dagegen die Anzeige der benötigten Zeit.

Auf dem Tab ‚Overall‘ findet sich der Code der in Summe die meiste Zeit verbraucht hat. Dies ist für gewöhnlich auch die Stelle an der man schnell die größten Gewinne machen kann. Für den Symfony Task findet sich beispielsweise hier:

1Function  : sfFinder->search_in
2Avg. Self : 0,2ms
3Avg. Cum. : 5,1ms
4Total Self: 127ms
5Total Cum.: 3214ms
6Calls     : 629

die search_in Funktion benötigt selbst im Schnitt 0,2ms, aufgerufene Funktionen benötigen in Summe im Schnitt 5,1ms. Da die Funktion 629 mal aufgerufen wurde ergibt dies dann die entsprechenden Gesamtsummen. Nun kann man entweder schauen ob die Funktion wirklich so oft aufgerufen werden muss, und wenn ja, ob man nicht einen einzigen Durchlauf noch optmieren kann.

Auch ohne die richtige Spürnase für Performanceprobleme kann man mit dem beschriebenen Tooling auch PHP Anwendungen in der Performance optimieren. Es bleibt abzuwarten ob sich PHP und die entsprechenden Tools soweit entwickeln werden wie es heute schon status quo in Java ist.

|

Beitrag teilen

//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//

Gemeinsam bessere Projekte umsetzen.

Wir helfen deinem Unternehmen.

Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.

Hilf uns, noch besser zu werden.

Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.