Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.
- Aktualisiert:
- Autor:
- Roland Golla
Was ist ein Callgraph in PHP
Ein Callgraph ist eine visuelle Darstellung aller Funktionsaufrufe innerhalb einer PHP Anwendung. Er zeigt, welche Funktionen andere Funktionen aufrufen, wie oft diese Aufrufe stattfinden und wie viel Ausführungszeit jeder Pfad verbraucht. Für die PHP Entwicklung ist der Callgraph damit eines der wichtigsten Werkzeuge zur Performance Analyse und Code Optimierung.
Man unterscheidet zwischen statischen Callgraphs, die den Code ohne Ausführung analysieren, und dynamischen Callgraphs, die während der Laufzeit durch einen Profiler wie Xdebug erzeugt werden. Dynamische Callgraphs bilden das tatsächliche Verhalten einer Anwendung ab und liefern präzise Daten über Ausführungszeiten, Speicherverbrauch und Aufrufhäufigkeiten. Besonders bei Symfony Projekten mit vielen Service Layern und Dependency Injection Ketten macht ein Callgraph die versteckten Zusammenhänge zwischen Klassen und Methoden sichtbar.
Die Toolkette aus Xdebug (Profiling Daten erzeugen), gprof2dot (Daten in das DOT Format konvertieren) und dem dot Command aus Graphviz (Graph als Bild rendern) bildet den Standard Workflow für PHP Callgraph Erstellung auf der Kommandozeile. Dieser Workflow funktioniert auf allen Betriebssystemen und lässt sich problemlos in CI/CD Pipelines integrieren.
Erreichen Sie unsere PHP Consultant Spezialisten
Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.
Wie funktioniert die Callgraph Erstellung mit Xdebug und gprof2dot
Der Workflow zur Callgraph Erstellung in PHP folgt einem klaren Drei Schritte Prinzip. Zunächst erzeugt Xdebug im Profiling Modus eine Callgrind Datei, die sämtliche Funktionsaufrufe mit Zeitinformationen enthält. Anschließend konvertiert gprof2dot diese Rohdaten in das DOT Graphformat. Im letzten Schritt rendert der dot Command aus dem Graphviz Paket den fertigen Callgraph als PNG, SVG oder PDF.
Der gesamte Workflow lässt sich in einer einzigen Pipe auf der Kommandozeile ausführen:
gprof2dot -f callgrind /tmp/cachegrind.out.12345 | dot -Tpng -o callgraph.png
Dieser Befehl liest die von Xdebug erzeugte Callgrind Datei, filtert unwichtige Funktionsaufrufe automatisch heraus und generiert ein farbcodiertes Bild. Rote Knoten markieren die zeitintensivsten Funktionen (Hotspots), während grüne Knoten performante Bereiche darstellen. Kanten zwischen den Knoten zeigen die Aufrufbeziehungen mit prozentualer Zeitverteilung.
Xdebug Profiler konfigurieren
Damit Xdebug Profiling Daten im Callgrind Format schreibt, muss die php.ini entsprechend konfiguriert werden. Ab Xdebug 3 erfolgt die Aktivierung über den xdebug.mode Parameter. Die folgenden Einstellungen aktivieren den Profiler und schreiben die Ausgabedateien in das temporäre Verzeichnis:
[xdebug]
xdebug.mode = profile
xdebug.start_with_request = default
xdebug.output_dir = /tmp
xdebug.profiler_output_name = cachegrind.out.%t.%p
Der Platzhalter %t steht für den Unix Timestamp und %p für die Prozess ID. So entsteht pro Request eine eindeutige Datei. Nach einem Neustart des Webservers erzeugt jeder HTTP Request automatisch eine Callgrind Datei im konfigurierten Verzeichnis. Für die gezielte Analyse einzelner Requests empfiehlt sich xdebug.start_with_request = trigger in Kombination mit einem Browser Plugin oder dem Query Parameter XDEBUG_PROFILE=1.
Wichtig: Profiling verlangsamt die Anwendung erheblich. Den Profiler deshalb niemals dauerhaft in Produktionsumgebungen aktivieren, sondern nur gezielt für die Analyse einschalten. Für kontinuierliches Production Profiling eignen sich Tools wie SPX oder Tideways mit deutlich geringerem Overhead.
gprof2dot installieren und verwenden
gprof2dot ist ein Python Tool, das Profiling Ausgaben verschiedener Formate in DOT Graphen konvertiert. Die Installation erfolgt über pip:
pip install gprof2dot
Für die Arbeit mit PHP Callgrind Dateien wird das Format callgrind verwendet. Die wichtigsten Optionen steuern, welche Knoten und Kanten im Graph erscheinen:
- -n / --node-thres: Schwellenwert in Prozent für Knoten (Standard: 0.5%). Funktionen unterhalb dieses Werts werden ausgeblendet
- -e / --edge-thres: Schwellenwert für Kanten (Standard: 0.1%)
- -f / --format: Eingabeformat, hier
callgrindfür Xdebug Dateien - -c / --colormap: Farbschema des Graphen (color, bw, gray, pink, print)
- -z / --root: Graph auf Nachfolger einer bestimmten Funktion beschränken
- -l / --leaf: Graph auf Vorfahren einer bestimmten Funktion beschränken
Für einen vollständigen Callgraph ohne Filterung setzt man beide Schwellenwerte auf null:
gprof2dot -f callgrind -n0 -e0 cachegrind.out.12345 -o full_graph.dot
Bei großen Symfony Anwendungen empfiehlt sich die Eingrenzung auf bestimmte Namespaces mit der --root oder --leaf Option, um übersichtliche Graphen zu erzeugen. Ohne Filterung können Callgraphs komplexer Anwendungen schnell mehrere tausend Knoten umfassen.
dot Command und Graphviz
Der dot Command ist Teil des Open Source Pakets Graphviz und übernimmt das Rendering von DOT Graphbeschreibungen zu visuellen Ausgabeformaten. Die Installation erfolgt je nach Betriebssystem über den Paketmanager:
# Ubuntu/Debian
sudo apt install graphviz
# macOS mit Homebrew
brew install graphviz
# Windows mit Chocolatey
choco install graphviz
Nach der Installation steht der dot Command global zur Verfügung. Die gängigsten Ausgabeformate für Callgraphs sind:
- PNG (
-Tpng): Pixelbasiert, ideal für schnelle Ansicht und Dokumentation - SVG (
-Tsvg): Vektorbasiert, skalierbar und im Browser interaktiv nutzbar - PDF (
-Tpdf): Druckfähig, geeignet für Reports und Präsentationen
Der komplette Workflow von der Callgrind Datei bis zum fertigen Bild in einer Pipe:
gprof2dot -f callgrind cachegrind.out.12345 | dot -Tsvg -o callgraph.svg
Für interaktive Analyse empfiehlt sich das SVG Format, da moderne Browser Zoom und Suche innerhalb der Grafik ermöglichen. Bei besonders großen Graphen kann alternativ xdot.py als interaktiver Viewer eingesetzt werden.
Callgraph Analyse und Performance Optimierung
Ein generierter Callgraph zeigt für jeden Funktionsknoten drei zentrale Metriken: den Funktionsnamen, die Total Time (inklusive aller aufgerufenen Unterfunktionen) und die Self Time (ausschließlich die eigene Ausführungszeit). Die Farbcodierung von Rot über Gelb nach Grün macht Hotspots sofort sichtbar.
Typische Performance Probleme, die ein Callgraph in PHP Anwendungen aufdeckt:
- N+1 Query Probleme: Datenbankabfragen in Schleifen erzeugen hunderte identische Aufrufe, sichtbar als Kante mit hoher Call Count
- Unnötige Serialisierung: JSON oder XML Encoding an unerwarteten Stellen im Request Lifecycle
- Überflüssige Event Listener: Symfony Event Dispatcher löst teure Listener bei jedem Request aus
- Cache Misses: Doctrine Hydration ohne Second Level Cache führt zu redundanten Datenbankzugriffen
- Tiefe Aufrufketten: Dependency Injection Container mit vielen Lazy Services verzögern den Bootstrap
Für die systematische Performance Optimierung von Symfony und Legacy PHP Projekten bietet NCA Vibe Coding Consulting professionelle Unterstützung. Von der initialen Profiling Analyse über gezieltes Refactoring bis zur Einbindung in CI/CD Pipelines: Kontaktieren Sie uns für eine kostenlose Erstberatung unter roland@nevercodealone.de oder telefonisch unter +49 176 24747727.
Alternativen und ergänzende Tools
Neben der Kommandozeilen Toolkette aus gprof2dot und dot gibt es weitere Möglichkeiten, Callgrind Daten zu visualisieren und zu analysieren:
- QCacheGrind / KCacheGrind: Desktop Anwendungen mit interaktiver Callgraph Darstellung, Treemap und Source Code Annotation. QCacheGrind läuft auf macOS und Windows, KCacheGrind auf Linux
- Webgrind: Browser basiertes Frontend für Xdebug Profiling Daten. Nutzt intern gprof2dot und dot für die Graphgenerierung. Ideal für schnelle Analyse ohne Desktop Installation
- SPX: PHP Extension mit eingebautem Web UI und Flame Graph Darstellung. Deutlich geringerer Overhead als Xdebug, geeignet für Production Profiling
- Tideways: Kommerzieller PHP Profiler mit Callgraph View, Trace Timeline und dauerhaftem Production Monitoring
- phpCallGraph: Statischer Callgraph Generator, der PHP Code ohne Ausführung analysiert. Nutzt ebenfalls Graphviz für die Visualisierung
Die Wahl des richtigen Tools hängt vom Einsatzzweck ab. Für einmalige, tiefgehende Analysen ist die gprof2dot Pipeline optimal. Für regelmäßiges Monitoring empfehlen sich SPX oder Tideways. QCacheGrind bietet die beste interaktive Analyse einzelner Profiling Sessions.
Lass uns sprechen
Finde das passende Angebot für dein Projekt
Anfrage-Konfiguration
Starten Sie Ihre Anfrage
Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.
Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.
Anfrage-Konfiguration
Worauf liegt dein Fokus?
Wähle die Expertise, die dein Projekt jetzt am dringendsten benötigt.
Xdebug alone has probably saved millions of hours of programmer time.
NCA PHP Performance Consulting
Never Code Alone unterstützt Entwicklungsteams bei der systematischen Performance Analyse und Optimierung von PHP Anwendungen. Mit tiefgreifender Erfahrung in Symfony, Sulu CMS und Legacy PHP Projekten identifizieren wir Engpässe durch professionelles Profiling mit Xdebug, gprof2dot und ergänzenden Tools wie SPX und Tideways.
Unser Leistungsspektrum umfasst die Einrichtung automatisierter Profiling Workflows in CI/CD Pipelines, die Analyse komplexer Callgraphs zur Identifikation von N+1 Queries und unnötigen Service Calls, sowie gezieltes Refactoring mit messbaren Performance Verbesserungen. Von der ersten Analyse bis zur dokumentierten Optimierung begleiten wir den gesamten Prozess.
Vereinbaren Sie eine kostenlose Erstberatung: roland@nevercodealone.de | +49 176 24747727
Häufige Fragen zu Callgraph mit gprof2dot und dot
Die wichtigsten Fragen und Antworten rund um PHP Callgraph Erstellung, gprof2dot Konfiguration und Graphviz dot Rendering.
Wie erstelle ich einen PHP Callgraph 2026?
Aktivieren Sie Xdebug mit xdebug.mode=profile in der php.ini, führen Sie einen Request aus und konvertieren Sie die erzeugte Callgrind Datei mit gprof2dot und dot in ein Bild. Der Befehl lautet: gprof2dot -f callgrind cachegrind.out.12345 | dot -Tpng -o callgraph.png
Was ist gprof2dot und wofür wird es 2026 eingesetzt?
gprof2dot ist ein Python Tool, das Profiling Daten verschiedener Formate in das DOT Graphformat konvertiert. Es unterstützt unter anderem Callgrind (Xdebug), pstats (Python), perf (Linux) und gprof. In der PHP Entwicklung ist es das Standardtool zur Callgraph Visualisierung.
Welche gprof2dot Version brauche ich 2026?
gprof2dot benötigt Python 3.8 oder neuer. Die aktuelle Version wird über pip install gprof2dot installiert. Zusätzlich muss Graphviz auf dem System verfügbar sein, damit der dot Command funktioniert.
Wie analysiere ich Symfony Performance mit Callgraphs 2026?
Konfigurieren Sie Xdebug für Profiling, führen Sie den zu analysierenden Request aus und erzeugen Sie den Callgraph mit gprof2dot. Achten Sie besonders auf Event Listener, Doctrine Hydration und Service Container Initialisierung als typische Engpässe in Symfony Anwendungen.
Welche Callgraph Tools gibt es für PHP 2026?
Die wichtigsten Tools sind Xdebug mit gprof2dot und dot (Kommandozeile), QCacheGrind und KCacheGrind (Desktop), Webgrind (Browser), SPX (Extension mit Web UI), Tideways (Commercial) und phpCallGraph (statische Analyse). Jedes Tool hat unterschiedliche Stärken bei Overhead, Interaktivität und Integrierbarkeit.
Was ist der Unterschied zwischen Self Time und Total Time?
Self Time misst ausschließlich die Ausführungszeit innerhalb einer Funktion selbst. Total Time umfasst zusätzlich die Zeit aller aufgerufenen Unterfunktionen. Ein hoher Self Time Anteil deutet auf rechenintensive Logik innerhalb der Funktion hin, ein hoher Total Time bei niedrigem Self Time auf teure Unterfunktionsaufrufe.
Wie reduziere ich die Größe meines Callgraphs?
Verwenden Sie die Optionen node-thres und edge-thres von gprof2dot, um Knoten und Kanten unterhalb eines bestimmten Prozentsatzes auszublenden. Alternativ grenzen Sie mit root oder leaf den Graph auf bestimmte Funktionen ein. Für Symfony Projekte empfiehlt sich die Fokussierung auf den eigenen Namespace.
Kann ich Callgraphs in CI/CD Pipelines automatisieren?
Ja, der gesamte Workflow lässt sich in CI/CD Pipelines integrieren. Xdebug Profiling kann über Umgebungsvariablen aktiviert werden, und der gprof2dot plus dot Befehl erzeugt das Bild automatisch. Die Callgraph Bilder können als Artefakte gespeichert und bei Performance Regressionen als Vergleich herangezogen werden.
Welche Ausgabeformate unterstützt der dot Command?
Der dot Command von Graphviz unterstützt über 30 Ausgabeformate, darunter PNG, SVG, PDF, PS, GIF und JPEG. Für Callgraphs empfiehlt sich SVG für interaktive Analyse im Browser und PNG für schnelle Dokumentation. PDF eignet sich für druckfähige Reports.
Was ist der Unterschied zwischen statischem und dynamischem Callgraph?
Ein statischer Callgraph analysiert den Quellcode ohne Ausführung und zeigt alle möglichen Aufrufpfade. Ein dynamischer Callgraph wird zur Laufzeit durch einen Profiler erzeugt und bildet nur die tatsächlich ausgeführten Pfade mit Zeitinformationen ab. Für Performance Optimierung sind dynamische Callgraphs aussagekräftiger.
Wie vergleiche ich zwei Callgraphs miteinander?
gprof2dot bietet eine compare Option, die zwei Profiling Dateien vergleicht und Unterschiede in Ausführungszeit und Aufrufhäufigkeit visualisiert. Der Befehl lautet: gprof2dot -f callgrind --compare profil1.out profil2.out | dot -Tpng -o vergleich.png. Pfeile zeigen die Richtung der Veränderung an.
Warum ist mein Callgraph leer oder zeigt keine Daten?
Häufige Ursachen sind eine zu kurze Ausführungszeit des Profiling Laufs, falsche Xdebug Konfiguration (xdebug.mode muss profile enthalten) oder zu hohe Schwellenwerte in gprof2dot. Setzen Sie testweise node-thres und edge-thres auf 0, um alle Funktionsaufrufe anzuzeigen.