PHP
Performance
Suche…
Profilierung mit XHProf
XHProf ist ein ursprünglich von Facebook geschriebener PHP-Profiler, der eine leichtere Alternative zu XDebug darstellt.
Nach der Installation des xhprof
PHP-Moduls kann die Profilerstellung aus PHP-Code aktiviert / deaktiviert werden:
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
Das zurückgegebene Array enthält Daten zur Anzahl der Aufrufe, zur CPU-Zeit und zur Speicherauslastung jeder Funktion, auf die in doSlowOperation()
zugegriffen wurde.
xhprof_sample_enable()
/ xhprof_sample_disable()
kann als leichtere Option verwendet werden, die nur Profilierungsinformationen für einen Bruchteil von Anforderungen (und in einem anderen Format) protokolliert.
XHProf hat einige (meist undokumentierte) Hilfsfunktionen zur Anzeige der Daten ( siehe Beispiel ), oder Sie können andere Tools verwenden, um sie zu visualisieren (der blog.sh-Blog enthält ein Beispiel ).
Speichernutzung
Das Laufzeitlimit von PHP wird über die INI-Direktive memory_limit
. Diese Einstellung verhindert, dass bei einer einzelnen Ausführung von PHP zu viel Speicherplatz verbraucht wird, was für andere Skripts und Systemsoftware erschöpft ist. Das Speicherlimit ist standardmäßig auf php.ini
und kann in der Datei php.ini
oder zur Laufzeit geändert werden. Es kann eingestellt werden, dass es keine Begrenzung gibt, aber dies wird im Allgemeinen als schlechte Praxis betrachtet.
Die genaue während der Laufzeit verwendete Speichernutzung kann durch Aufrufen von memory_get_usage()
. Es gibt die Anzahl der Speicherbytes zurück, die dem aktuell ausgeführten Skript zugeordnet sind. Ab PHP 5.2 gibt es einen optionalen booleschen Parameter, um den gesamten zugewiesenen Systemspeicher abzurufen, im Gegensatz zu dem von PHP aktiv genutzten Speicher.
<?php
echo memory_get_usage() . "\n";
// Outputs 350688 (or similar, depending on system and PHP version)
// Let's use up some RAM
$array = array_fill(0, 1000, 'abc');
echo memory_get_usage() . "\n";
// Outputs 387704
// Remove the array from memory
unset($array);
echo memory_get_usage() . "\n";
// Outputs 350784
Jetzt memory_get_usage
Sie mit memory_get_usage
die Speicherbelegung, sobald es ausgeführt wird. Zwischen Aufrufen dieser Funktion können Sie andere Dinge im Speicher zuordnen und freigeben. Rufen Sie memory_get_peak_usage()
, um bis zu einem bestimmten Punkt die maximale Speichermenge zu erhalten.
<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776
Beachten Sie, dass der Wert nur steigt oder konstant bleibt.
Profilierung mit Xdebug
Eine Erweiterung zu PHP namens Xdebug ist verfügbar, um das Profilieren von PHP-Anwendungen sowie das Laufzeit-Debugging zu unterstützen. Beim Ausführen des Profilers wird die Ausgabe in eine Datei im Binärformat mit dem Namen "cachegrind" geschrieben. Auf jeder Plattform sind Anwendungen verfügbar, um diese Dateien zu analysieren.
Um die Profilerstellung zu aktivieren, installieren Sie die Erweiterung und passen Sie die Einstellungen von php.ini an. In unserem Beispiel führen wir das Profil optional basierend auf einem Anforderungsparameter aus. Dadurch können wir die Einstellungen statisch beibehalten und den Profiler nur bei Bedarf einschalten.
// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
Verwenden Sie anschließend einen Web-Client, um eine Anfrage an die URL Ihrer Anwendung zu stellen, die Sie profilieren möchten, z
http://example.com/article/1?XDEBUG_PROFILE=1
Während die Seite verarbeitet wird, schreibt sie in eine Datei mit einem ähnlichen Namen
/tmp/cachegrind.out.12345
Beachten Sie, dass für jede ausgeführte PHP-Anforderung / jeden Prozess eine Datei geschrieben wird. Wenn Sie beispielsweise einen Formularbeitrag analysieren möchten, wird ein Profil für die GET-Anforderung geschrieben, um das HTML-Formular anzuzeigen. Der Parameter XDEBUG_PROFILE muss an die nachfolgende POST-Anforderung übergeben werden, um die zweite Anforderung zu analysieren, die das Formular verarbeitet. Daher ist es beim Profilieren manchmal einfacher, das POST eines Formulars direkt aufzurufen.
Nach dem Schreiben kann der Profil-Cache von einer Anwendung wie KCachegrind gelesen werden.
Daraufhin werden Informationen angezeigt, darunter:
- Funktionen ausgeführt
- Aufrufzeit, sowohl selbst als auch nachfolgende Funktionsaufrufe
- Anzahl der Aufrufe jeder Funktion
- Diagramme aufrufen
- Links zum Quellcode
Natürlich ist die Leistungsoptimierung für die Anwendungsfälle jeder Anwendung sehr spezifisch. Im Allgemeinen ist es gut zu suchen:
- Wiederholte Aufrufe derselben Funktion, die Sie nicht erwarten würden. Für Funktionen, die Daten verarbeiten und abfragen, können dies ideale Möglichkeiten für die Zwischenspeicherung Ihrer Anwendung sein.
- Langsamlaufende Funktionen. Wo verbringt die Anwendung die meiste Zeit? Der beste Gewinn bei der Leistungsoptimierung ist die Konzentration auf diejenigen Teile der Anwendung, die am meisten Zeit beanspruchen.
Hinweis : Xdebug und insbesondere seine Profilierungsfunktionen sind sehr ressourcenintensiv und verlangsamen die PHP-Ausführung. Es wird empfohlen, diese nicht in einer Produktionsserverumgebung auszuführen.