Local (früher “Local by Flywheel oder “Pressmatics”) mit XDebug Profiler nutzen

Local ist derzeit das Tool meiner Wahl wenn es um die lokale Entwicklungsumgebung geht. Was ist allerdings, wenn man den XDebug Profiler benötigt und man von NGINX nur den Fehler 504 zurückbekommt? Hier ist die Lösung.

Das Problem ist, dass nginx bzw. PHP abbricht, wenn eine bestimmte Scriptlaufzeit überschritten ist. Da das Profiling aber sehr lange dauern kann, ist es gut, dass man (lokal) die maximale Ausführungszeit erhöht. Und das geht so:

1. a) php.ini anpassen: max_execution_time

Man öffnet die php.ini.hbs aus einem Local-Verzeichnis, z.B.: die Datei app/conf/php/php.ini.hbs und setzt dann

max_execution_time = 1000 # 1000 = ca. 16.6 Minuten.

1. b) php.ini anpassen: xdebug einstellen

Zusätzlich sollte man folgendes einfügen. Achtung: xdebug.remote_host muss auf die Domain zeigen, die gewählt wurde. Bei mir ist das meist der-domain-name.dev.

[Xdebug]
zend_extension = /opt/php/7.0.3/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so
xdebug.remote_enable=1
xdebug.remote_connect_back=On
xdebug.remote_port="9000"
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger = 1; # browser trigger
xdebug.remote_host=der-hostname.dev
xdebug.profiler_output_dir = /var/log/php/profiler/

Danach sollte man noch das Verzeichnis /logs/php/profiler/ anlegen.

2. php-fpm Konfiguration anpassen

Im Verzeichnis /conf/php/7.0.3/etc/php-fpm.d/ findet man die Datei www.conf.hbs. Dort kommentiert man nachfolgende Zeile aus und passt sie an:

request_terminate_timeout = 1000

Der Grund: dieser Wert sollte auf den gleichen Wert wie max_execution_time aus der php.ini eingestellt sein.

3. Fastcgi-Read-Timeout

Nun öffnet man noch die Datei conf/nginx/site.conf.hbs und hängt folgende Zeile am Ende an oder kommentiert sie aus (falls noch nicht geschehen):

fastcgi_read_timeout 1200;

Ansonsten würde der Fast-CGI-Prozess vorher schlapp machen.

4. Profiling starten

Da wir XDEBUG im Schritt 1b) so eingestellt haben, dass es auf Browser-Cookies reagiert (xdebug.profiler_enable_trigger = 1;) brauchen wir nur ein Cookie anlegen und dann die entsprechende Seite reloaden. Das klappt am besten mit den XDebug Helper Plugins von Jetbrains, die man sich hier anlegen kann.

5. Profile untersuchen

Nun bekommen wir Profiler-Dateien im Verzeichnis logs/php/profiler/ angezeigt. Diese können wir z.B. mit PHPStorm auslesen und untersuchen. Der Menüpunkt dazu befindet sich unter Tools -> Analyze Xdebug Profiler Snapshot.

PHPStorm XDEBUG-Profiling

Das war’s.

PS: NGINX/PHP-FPM Neustart nicht vergessen!