Profilierung von PHP-Code: Engpässe in der Praxis finden
\nDie 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\nWas ist Profilierung und warum wird sie benötigt?
\nProfilierung 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.
\nDie 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
Integrierte Profilierungswerkzeuge von PHP
\nPHP bietet mehrere integrierte Funktionen für die erste Leistungsanalyse. Betrachten wir die nützlichsten.
\n\nDie Funktion microtime(true)
\nDer einfachste Weg, die Ausführungszeit eines Codeabschnitts zu messen, ist die Verwendung von microtime(true):
<?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\nDie Funktion memory_get_usage()
\nZur Überwachung des Speicherverbrauchs verwenden Sie memory_get_usage() und memory_get_peak_usage():
<?php\necho "Verwendeter Speicher: " . memory_get_usage() . " Bytes\\n";\necho "Spitzenverbrauch: " . memory_get_peak_usage() . " Bytes";\n?>\n\nDie Klassen DateTime und DateInterval
\nFü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\nProfessionelle Profilierungswerkzeuge
\nFür eine ernsthafte Optimierung reichen die integrierten Werkzeuge nicht aus. Betrachten wir drei beliebte Tools.
\n\nXdebug – der Klassiker der Profilierung
\nXdebug ist eine PHP-Erweiterung, die detaillierte Profile im cachegrind-Format erstellt. Installation über Composer:
\npecl install xdebug\nNach der Installation aktivieren Sie die Profilierung in der php.ini:
\nxdebug.mode = profile\nxdebug.output_dir = /tmp/profiler\nZur 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
Blackfire.io – Cloud-basierter Profiler
\nBlackfire.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);\nBlackfire zeigt automatisch:
\n- \n
- Optimierungsempfehlungen \n
- Vergleich mit vorherigen Profilen \n
- Analyse von SQL-Abfragen \n
Tideways – für die Produktionsumgebung
\nTideways ist ein leichtgewichtiger Profiler, der in Echtzeit arbeitet:
\ncomposer 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();\