Was ist der einfachste Weg, ein PHP-Skript zu profilieren?
Ich würde gerne etwas anheften, das mir einen Speicherauszug aller Funktionsaufrufe zeigt und wie lange sie gedauert haben, aber ich bin auch damit einverstanden, etwas um bestimmte Funktionen herum zu platzieren.
Ich habe versucht, mit der Mikrozeitfunktion zu experimentieren :
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
aber das gibt mir manchmal negative ergebnisse. Außerdem ist es eine Menge Mühe, das über meinen Code zu streuen.
microtime()
führt dazu, dass manchmal Ausdrücke wie:"0.00154800 1342892546" - "0.99905700 1342892545"
ausgewertet werden, die wie: ausgewertet werden0.001548 - 0.999057
. Sie können verwendet werdenmicrotime( TRUE )
, wie es um dieses Problem zu vermeiden , weist darauf hin , durch @luka.Antworten:
Die PECL APD- Erweiterung wird wie folgt verwendet:
Analysieren Sie anschließend die generierte Datei mit
pprofp
.Beispielausgabe:
Warnung: Die neueste Version von APD ist auf das Jahr 2004 datiert, die Erweiterung wird nicht mehr beibehalten und weist verschiedene Kompatibilitätsprobleme auf (siehe Kommentare).
quelle
pecl install apd
, wird eine Fehlermeldung zu "config.m4" angezeigt. Es scheint, als müssten Sie es von der Quelle installieren, was ich noch nicht ausprobiert habe. Im Ernst, gibt es nicht ein modernes, aktualisiertes CLI-basiertes Profiling-Tool für PHP, das mit Homebrew installiert wird, nur minimale Einstellungen erfordert und eine leicht lesbare Ausgabe liefert?Du willst xdebug, denke ich. Installieren Sie es auf dem Server, schalten Sie es ein, pumpen Sie die Ausgabe über kcachegrind (für Linux) oder wincachegrind (für Windows) und es zeigt Ihnen einige hübsche Diagramme, in denen die genauen Zeiten, die Anzahl und die Speichernutzung aufgeführt sind (aber Sie werden es tun) brauche eine andere Erweiterung dafür).
Es rockt ernsthaft: D.
quelle
Es sind keine Erweiterungen erforderlich. Verwenden Sie einfach diese beiden Funktionen für die einfache Profilerstellung.
Hier ist ein Beispiel, in dem prof_flag () mit einer Beschreibung an jedem Prüfpunkt und prof_print () am Ende aufgerufen wird:
Die Ausgabe sieht folgendermaßen aus:
Start
0.004303
Verbindung zum DB
0.003518
Perform Abfrage
0.000308
Abrufen von Daten
0.000009
Schließen DB
0.000049
Erledigt
quelle
Cross-Posting meiner Referenz aus der SO Documentation Beta, die offline geschaltet wird.
Profilerstellung mit XDebug
Eine PHP-Erweiterung namens Xdebug hilft bei der Profilerstellung von PHP-Anwendungen sowie beim Debuggen zur Laufzeit. Beim Ausführen des Profilers wird die Ausgabe in eine Datei in einem Binärformat namens "Cachegrind" geschrieben. Auf jeder Plattform stehen Anwendungen zur Analyse dieser Dateien zur Verfügung. Für diese Profilerstellung sind keine Änderungen des Anwendungscodes erforderlich.
Um die Profilerstellung zu aktivieren, installieren Sie die Erweiterung und passen Sie die Einstellungen für php.ini an. Einige Linux-Distributionen werden mit Standardpaketen geliefert (z. B. Ubuntus
php-xdebug
Paket). In unserem Beispiel führen wir das Profil optional basierend auf einem Anforderungsparameter aus. Dies ermöglicht es uns, die Einstellungen statisch zu halten und den Profiler nur bei Bedarf einzuschalten.Verwenden Sie als Nächstes einen Webclient, um eine Anfrage an die URL Ihrer Anwendung zu stellen, die Sie profilieren möchten, z
Während der Verarbeitung der Seite wird in eine Datei mit einem ähnlichen Namen wie geschrieben
Standardmäßig ist die Nummer im Dateinamen die Prozess-ID, die sie geschrieben hat. Dies ist mit der
xdebug.profiler_output_name
Einstellung konfigurierbar .Beachten Sie, dass für jede ausgeführte PHP-Anforderung / jeden ausgeführten PHP-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 bei der Profilerstellung manchmal einfacher, Curl auszuführen, um ein Formular direkt zu POSTEN.
Analyse der Ausgabe
Nach dem Schreiben kann der Profilcache von einer Anwendung wie KCachegrind oder Webgrind gelesen werden . PHPStorm, eine beliebte PHP-IDE, kann diese Profildaten auch anzeigen .
KCachegrind zeigt beispielsweise Informationen an, darunter:
Wonach schauen
Offensichtlich ist die Leistungsoptimierung sehr spezifisch für die Anwendungsfälle jeder Anwendung. Im Allgemeinen ist es gut zu suchen:
Hinweis : Xdebug und insbesondere seine Profiling-Funktionen sind sehr ressourcenintensiv und verlangsamen die PHP-Ausführung. Es wird empfohlen, diese nicht in einer Produktionsserverumgebung auszuführen.
quelle
Wenn das Subtrahieren von Mikrotzeiten zu negativen Ergebnissen führt, verwenden Sie die Funktion mit dem Argument
true
(microtime(true)
). Mittrue
gibt die Funktion ein Float anstelle eines Strings zurück (wie es der Fall ist, wenn es ohne Argumente aufgerufen wird).quelle
Ehrlich gesagt werde ich argumentieren, dass die Verwendung von NewRelic für die Profilerstellung das Beste ist.
Es ist eine PHP-Erweiterung, die die Laufzeit anscheinend überhaupt nicht verlangsamt. Sie übernimmt die Überwachung für Sie und ermöglicht einen angemessenen Drilldown. In der teuren Version erlauben sie schwere Drilldowns (aber wir können uns ihr Preismodell nicht leisten).
Selbst mit dem kostenlosen / Standardplan ist es offensichtlich und einfach, wo sich die meisten niedrig hängenden Früchte befinden. Mir gefällt auch, dass es Ihnen auch eine Vorstellung von DB-Interaktionen geben kann.
quelle
Profiling des armen Mannes, keine Erweiterungen erforderlich. Unterstützt verschachtelte Profile und Prozent der Gesamtzahl:
Beispiel:
Ausbeuten:
quelle
PECL XHPROF sieht ebenfalls interessant aus. Es hat eine anklickbare HTML-Oberfläche zum Anzeigen von Berichten und eine ziemlich einfache Dokumentation . Ich muss es allerdings noch testen.
quelle
Ich benutze gerne phpDebug für die Profilerstellung. http://phpdebug.sourceforge.net/www/index.html
Es gibt die gesamte Zeit- / Speichernutzung für jedes verwendete SQL sowie alle enthaltenen Dateien aus. Offensichtlich funktioniert es am besten mit abstrahiertem Code.
Für die Funktions- und Klassenprofilerstellung verwende ich einfach
microtime()
+get_memory_usage()
+get_peak_memory_usage()
.quelle
Ich würde BlackFire trotzig ausprobieren.
Es gibt diese virtualBox, die ich mit puphpet zusammengestellt habe , um verschiedene PHP-Frameworks zu testen, die mit BlackFire geliefert werden. Bei Bedarf können Sie diese gerne teilen und / oder verteilen :)
https://github.com/webit4me/PHPFrameworks
quelle
Für das Benchmarking verwende ich wie in Ihrem Beispiel das Birnen-Benchmark- Paket. Sie setzen Marker zum Messen. Die Klasse bietet auch einige Präsentationshilfen, oder Sie können die Daten nach Belieben verarbeiten.
Ich habe es tatsächlich in einer anderen Klasse mit einer __destruct-Methode verpackt. Wenn ein Skript beendet wird, wird die Ausgabe über log4php in syslog protokolliert, sodass ich viele Leistungsdaten zur Verfügung habe.
quelle
XDebug ist nicht stabil und für bestimmte PHP-Versionen nicht immer verfügbar. Zum Beispiel führe ich auf einigen Servern immer noch PHP-5.1.6 aus - es ist das, was mit RedHat RHEL5 geliefert wird (und übrigens erhält es immer noch Updates für alle wichtigen Probleme), und der aktuelle XDebug kompiliert nicht einmal mit diesem PHP. Am Ende wechselte ich zum DBG-Debugger. Das PHP-Benchmarking bietet Timing für Funktionen, Methoden, Module und sogar Zeilen.
quelle
Sie alle sollten auf jeden Fall diesen neuen PHP-Profiler überprüfen.
https://github.com/NoiseByNorthwest/php-spx
Es definiert die Art und Weise neu, wie PHP-Profiler das Ergebnis sammeln und präsentieren. Anstatt nur eine Gesamtzahl bestimmter Funktionsaufrufe und die Gesamtzeit für deren Ausführung auszugeben, präsentiert PHP-SPX die gesamte Zeitleiste der Anforderungsausführung auf perfekt lesbare Weise. Unten sehen Sie den Bildschirm der GUI.
quelle