Profilierung von PHP-Code: Engpässe in der Praxis finden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Profilierung von PHP-Code: Engpässe in der Praxis finden

\n

Die Leistung von PHP-Anwendungen wirkt sich direkt auf die Benutzererfahrung und die Kosten für Serverhardware aus. Oft stehen Entwickler vor der Situation, dass die Website langsam läuft, die Ursache jedoch nicht offensichtlich ist. In diesem Artikel werden wir praktische Methoden zur Profilierung von PHP-Code behandeln, die helfen, Engpässe zu identifizieren und Ihre Anwendung zu beschleunigen.

\n\n

Was ist Profilierung und warum wird sie benötigt?

\n

Profilierung ist der Prozess der Datenerfassung über die Programmausführung: Ausführungszeit von Funktionen, Anzahl der Aufrufe, Speicher- und E/A-Nutzung. Im Gegensatz zur einfachen Protokollierung erstellt der Profiler ein vollständiges Bild der Skriptausführung.

\n

Die Hauptziele der PHP-Profilierung:

\n
    \n
  • Identifizierung langsamer Funktionen und Methoden
  • \n
  • Erkennung von Speicherlecks
  • \n
  • Analyse der Anzahl von Datenbankabfragen
  • \n
  • Optimierung der Seitenladezeiten
  • \n
\n\n

Integrierte Profilierungswerkzeuge von PHP

\n

PHP bietet mehrere integrierte Funktionen für die erste Leistungsanalyse. Betrachten wir die nützlichsten.

\n\n

Die Funktion microtime(true)

\n

Der einfachste Weg, die Ausführungszeit eines Codeabschnitts zu messen, ist die Verwendung von microtime(true):

\n
<?php\n$start = microtime(true);\n\n// Ihr Code\n$data = [];\nfor ($i = 0; $i < 10000; $i++) {\n    $data[] = $i * $i;\n}\n\n$end = microtime(true);\n$executionTime = ($end - $start) * 1000;\necho "Ausführungszeit: " . round($executionTime, 2) . " ms";\n?>
\n\n

Die Funktion memory_get_usage()

\n

Zur Überwachung des Speicherverbrauchs verwenden Sie memory_get_usage() und memory_get_peak_usage():

\n
<?php\necho "Verwendeter Speicher: " . memory_get_usage() . " Bytes\\n";\necho "Spitzenverbrauch: " . memory_get_peak_usage() . " Bytes";\n?>
\n\n

Die Klassen DateTime und DateInterval

\n

Für genauere Messungen langer Operationen verwenden Sie DateTime-Objekte:

\n
<?php\n$start = new DateTime();\n\n// Lange Operation\nsleep(2);\n\n$end = new DateTime();\n$interval = $start->diff($end);\necho "Vergangen: " . $interval->format('%s Sekunden');\n?>
\n\n

Professionelle Profilierungswerkzeuge

\n

Für eine ernsthafte Optimierung reichen die integrierten Werkzeuge nicht aus. Betrachten wir drei beliebte Tools.

\n\n

Xdebug – der Klassiker der Profilierung

\n

Xdebug ist eine PHP-Erweiterung, die detaillierte Profile im cachegrind-Format erstellt. Installation über Composer:

\n
pecl install xdebug
\n

Nach der Installation aktivieren Sie die Profilierung in der php.ini:

\n
xdebug.mode = profile\nxdebug.output_dir = /tmp/profiler
\n

Zur Analyse der erstellten Dateien verwenden Sie QCacheGrind (Linux) oder WinCacheGrind (Windows). Beispiel einer Profilausgabe:

\n
    \n
  • Ausführungszeit jedes Funktionsaufrufs
  • \n
  • Anzahl der Aufrufe
  • \n
  • Aufrufhierarchie
  • \n
  • Speicherverbrauch
  • \n
\n\n

Blackfire.io – Cloud-basierter Profiler

\n

Blackfire.io von SensioLabs (den Erstellern von Symfony) bietet eine erweiterte Analyse mit Visualisierung:

\n
# Installation des Agents\ncurl -s https://blackfire.io/install.sh | bash\n\n# Profilierung über die API\n$blackfire = new \\Blackfire\\Client();\n$probe = $blackfire->createProbe();\n\n// Ihr Code\n$users = User::findAll();\n\n$blackfire->endProbe($probe);
\n

Blackfire zeigt automatisch:

\n
    \n
  • Optimierungsempfehlungen
  • \n
  • Vergleich mit vorherigen Profilen
  • \n
  • Analyse von SQL-Abfragen
  • \n
\n\n

Tideways – für die Produktionsumgebung

\n

Tideways ist ein leichtgewichtiger Profiler, der in Echtzeit arbeitet:

\n
composer require tideways/profiler\n\n// Aktivierung der Profilierung\ntideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU);\n\n// Ihr Code\n$result = heavyFunction();\n\n$data = tideways_xhprof_disable();\                

Blogs

Buchempfehlungen