ziemlich wichtiger Hero Bereich der irgendwie gut aussieht aber inhaltlich nichts bringt

TYPO3 - PHP Performance analysieren und benchmarken mit Xdebug & PHPStorm

In meinem ersten Blogbeitrag zeige ich dir, wie man PHP Code mit Xdebug analysieren bzw. benchmarken kann, zum Beispiel von deiner TYPO3 Extension. So findest du Funktionsaufrufe die eventuell an deiner Performance nagen und siehst an welcher Stelle Optimierungen möglich sind.


  • Euer Xdebug ist fertig eingerichtet, dazu gibt es ein wunderbares Tutorial von Susanne Moog (TYPO3 GmbH)
    • Du kannst Breakpoints im Code setzen und diese werden in der IDE korrekt erreicht. Dadurch ist sichergestellt, dass die Pfade für den Webserver korrekt im Projekt gemappt sind und PHP Storm später die aufgerufenen Funktionen den richtigen PHP-Dateien zuordnen kann (mit F4 - Jump to Source).

Einrichtung


Bei der vorhanden php.ini fügt ihr nach der Xdebug Konfiguration einige weitere Zeilen hinzu:

 

xdebug.profiler_enable_trigger = 1
xdebug.profiler_enable = 0
xdebug.profiler_output_dir     = '/tmp/debug/'

 

profiler_enable_trigger = 1 erlaubt uns den Profiler aus dem Browser mit der Erweiterung auszulösen. 

Wir wollen nicht dass der Profiler durchgehend läuft, sondern manuell per Browserplugin den trigger setzen, wenn wir ein Benchmark durchführen wollen.

Deshalb setzen wir profiler_enable = 0.

profiler_output_dir ist der Pfad wohin die Daten vom Profiler geschrieben werden. In meinem Fall '/tmp/debug/'. Wenn ihr Docker nutzt, vergesst nicht diesen Ordner entsprechend zu mounten, so dass ihr die Dateien entsprechend in der IDE einsehen könnt.

So ähnlich sollte deine php.ini jetzt aussehen, wichtig sind hier nur die eben beschriebenen Zeilen. Der Rest ist abhängig von deiner Umgebung in der du entwickelst (Docker, XAMPP, etc):

 

#unwichtiger Kram
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
#zend_extension=xdebug.so
xdebug.remote_enable           = 1
xdebug.remote_connect_back     = 0
xdebug.remote_host             = host.docker.internal
xdebug.idekey                  = "PHPSTORM"
xdebug.cli_color               = 1
xdebug.max_nesting_level       = 1000
xhprof.output_dir = '/tmp/debug/'
#wichtiger Kram
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir     = '/tmp/debug/'

Jetzt setzen wir im Browser das Xdebug Plugin auf "Profile"

Wir laden die Seite bzw. führen den Request aus den wir testen wollen. Im vorhin festgelegten Ordner ('/tmp/debug/') werden dadurch von Xdebug Profile-Files erstellt. Diese können wir im nächsten Schritt mit PHPStorm analysieren.

Im Reiter "Tools" wählen wir "Analyze Xdebug Profiler Snapshot" und danach das File, was wir analysieren möchten. Die Files sind nach folgendem Muster benannt: cachegrind.out.XXX . In meinem Fall wurden bei jedem Request zwei Files angelegt, dem zweiten File wurde ein kurzer hash am Name ergänzt (vermutlich um die beiden cachegrinds die gleichzeitig erstellt werden zu unterscheiden). Die zweiten Files beinhalten allerdings nur einen einzelnen Funktionsaufruf von TYPO3\CMS\Sv\AuthenticationService->__destruct und war für mich erstmal uninteressant.

Wir wählen also jeweils das cachegrind File welches keinen zusätzlichen hash angehangen bekommen hat, sondern mit einer Zahlenfolge im Name endet. Hier im Bild beispielsweise cachegrind.out.976

Dadurch gelangen wir in die Übersicht "Execution Statistics".

 

An dieser Stelle habe ich bemerkt das mein Blog Beitrag schon ziemlich groß ist, deswegen wird das aufgeteilt. Hier geht es zum zweiten Teil sobald er online ist [LINK].

Mach euch bis dahin schonmal mit der Übersicht vertraut. Hier noch einige interessante Links zum gleichen Thema:

TIPP: wenn ihr in der Übersicht beginnt zu tippen (einfach los tippen), könnt ihr die aufgerufenen Funktionen durchsuchen.