IDE
{ }
PhpStorm · Path Mappings · Xdebug · Docker
Path Mappings in PhpStorm
verstehen statt Trial and Error

Breakpoints die nicht treffen, Xdebug der verbindet aber die Dateien nicht findet, Deployments die auf falschen Pfaden landen – fast alle diese Probleme haben dieselbe Ursache: falsch konfigurierte oder fehlende Path Mappings. Wer das Konzept versteht, löst diese Probleme in Minuten.

10 Min. Lesezeit Xdebug · Docker · Deployment · Remote PHP · Breakpoints PhpStorm 2024.x · 2025.x

1. Was Path Mappings wirklich sind

Ein Path Mapping ist eine Übersetzungsregel zwischen zwei Dateisystemen. Auf der einen Seite liegt das lokale Dateisystem des Entwicklers: der Pfad, unter dem PhpStorm die Quelldateien kennt. Auf der anderen Seite liegt das Remote-Dateisystem: der Pfad, unter dem PHP – sei es in einem Docker-Container, auf einem Staging-Server oder in einem Remote-Interpreter – dieselbe Datei sieht. Ohne diese Übersetzung kann PhpStorm einen Hinweis auf /var/www/html/vendor/magento/module-catalog/Model/Product.php vom Xdebug-Server nicht der lokalen Datei unter /home/mir/development/mironsoft/src/vendor/magento/module-catalog/Model/Product.php zuordnen.

Path Mappings sind kein Feature, das man einmal konfiguriert und vergisst. Jedes Mal, wenn sich die Projektstruktur ändert, ein neues Docker-Volume gemountet wird oder ein neuer Server hinzukommt, müssen die Mappings aktualisiert werden. Das Missverständnis, das zu den meisten Debugging-Problemen führt, ist die Annahme, dass PhpStorm die Pfade automatisch herleiten kann. Das kann die IDE nur in sehr einfachen Fällen – bei Docker-Containern, Remote-Servern und verschachtelten Projektstrukturen muss man sie explizit angeben.

2. Path Mappings für Xdebug konfigurieren

Xdebug verbindet sich mit PhpStorm und teilt der IDE mit, an welcher Datei es gerade arbeitet – mit dem Pfad, wie PHP ihn sieht, nicht wie PhpStorm ihn sieht. PhpStorm muss diesen Pfad übersetzen, um die richtige lokale Datei zu öffnen. Die Konfiguration erfolgt unter Settings → PHP → Debug → DBGp Proxy für die Verbindungsparameter und unter Settings → PHP → Servers für die Path Mappings selbst. Wichtig: Jeder Server-Eintrag in PhpStorm hat einen Namen, und dieser Name muss exakt mit dem Wert der Xdebug-Umgebungsvariable PHP_IDE_CONFIG=serverName=SERVERNAME übereinstimmen.

Die häufigste Fehlerquelle: Man erstellt einen Server-Eintrag mit dem Namen "localhost", setzt aber PHP_IDE_CONFIG=serverName=docker in der Docker-Compose-Datei. PhpStorm kann die eingehende Xdebug-Verbindung keinem Server-Eintrag zuordnen und legt entweder automatisch einen neuen Eintrag ohne Mappings an oder verwirft die Verbindung. Das Ergebnis: Breakpoints werden nie getroffen, obwohl der Debugger verbindet. Die Lösung ist trivial, sobald man das Konzept versteht: Server-Name in PhpStorm = serverName-Wert in PHP_IDE_CONFIG.


# docker-compose.yml — Xdebug-Konfiguration mit korrektem serverName
services:
  phpfpm:
    image: markoshust/magento-php:8.4-fpm
    environment:
      # CRITICAL: serverName must match PhpStorm → Settings → PHP → Servers → Name
      PHP_IDE_CONFIG: "serverName=mironsoft-docker"
      XDEBUG_MODE: "debug"
      XDEBUG_CONFIG: >-
        client_host=host-gateway
        client_port=9003
        start_with_request=trigger
        idekey=PHPSTORM
    volumes:
      - ./src:/var/www/html:delegated

# PhpStorm → Settings → PHP → Servers:
# Name:         mironsoft-docker          ← must match PHP_IDE_CONFIG serverName
# Host:         localhost
# Port:         80
# Debugger:     Xdebug
# Path Mappings:
#   /home/mir/development/mironsoft/src  →  /var/www/html

3. Docker-Container: lokale und Container-Pfade korrekt mappen

In Docker-basierten Projekten ist das Volume-Mapping der zentrale Ausgangspunkt für Path Mappings. Wenn ./src:/var/www/html in der docker-compose.yml definiert ist, dann ist das Path Mapping in PhpStorm genauso einfach: Lokaler Pfad /home/mir/development/mironsoft/src mappt auf Container-Pfad /var/www/html. Dieses eine Mapping genügt für alle Dateien unterhalb dieses Verzeichnisses – PhpStorm löst Unterverzeichnisse automatisch relativ auf.

Komplizierter wird es, wenn mehrere Volumes gemountet sind oder wenn Composer-Pakete außerhalb des Hauptverzeichnisses liegen. In Magento-Projekten, bei denen lokale Module aus app/code und Vendor-Pakete aus vendor alle im selben Container laufen, genügt ein einzelnes Root-Mapping. Kritisch wird es, wenn Symlinks im Spiel sind oder wenn derselbe Code über zwei verschiedene Pfade im Container erreichbar ist. In solchen Fällen muss man zusätzliche, spezifischere Mappings anlegen, die von PhpStorm mit höherer Priorität angewendet werden als das allgemeinere Root-Mapping.

4. Deployment-Server und Upload-Pfade

PhpStorm-Deployment-Konfigurationen unter Settings → Build, Execution, Deployment → Deployment nutzen ebenfalls Path Mappings. Hier gibt es drei Pfade: den Local path (auf dem Entwicklerrechner), den Deployment path (auf dem Remote-Server) und optional einen Web path (für Browser-URL-Zuordnung). Diese drei Felder zusammen bilden das Deployment-Mapping.

Ein häufiger Fehler ist, den Root-Pfad des Projekts korrekt einzutragen, aber den Deployment-Pfad relativ zum Web-Root des Servers falsch zu setzen. Wenn der Server Magento unter /var/www/vhosts/mironsoft.de/httpdocs hostet, aber man /var/www/html einträgt, landen Uploads an der falschen Stelle ohne Fehlermeldung. PhpStorm überträgt die Dateien erfolgreich – nur eben dorthin, wo sie niemand erwartet. Das Testen der Deployment-Konfiguration mit Tools → Deployment → Browse Remote Host zeigt sofort, ob PhpStorm den richtigen Pfad erreicht.


# PhpStorm Deployment-Konfiguration — Settings → Build, Execution, Deployment → Deployment
# Typ: SFTP

# Connection:
# Host:     staging.mironsoft.de
# Port:     22
# User:     deploy
# Auth:     Key pair ~/.ssh/id_ed25519

# Mappings (Tab "Mappings"):
# Local Path:       /home/mir/development/mironsoft/src
# Deployment Path:  /var/www/vhosts/mironsoft.de/httpdocs
# Web Path:         /

# Excluded Paths (Tab "Excluded Paths") — nie hochladen:
# /home/mir/development/mironsoft/src/var
# /home/mir/development/mironsoft/src/pub/static
# /home/mir/development/mironsoft/src/.git
# /home/mir/development/mironsoft/src/vendor

# Automatischer Upload:
# Tools → Deployment → Options → Upload changed files automatically: Always
# (nur für Staging verwenden — nie für Produktion)

5. Remote PHP-Interpreter und deren Pfadkonfiguration

Wenn PhpStorm einen Remote PHP-Interpreter nutzt – also PHP im Docker-Container oder auf einem Remote-Server statt dem lokalen PHP – muss die IDE wissen, wie die Pfade zwischen den Systemen zusammenhängen. Der Remote-Interpreter wird unter Settings → PHP → CLI Interpreter konfiguriert. Bei Docker-basierten Interpretern wählt man den Container aus und gibt den Pfad zum PHP-Binary im Container an.

PhpStorm versucht bei Docker-Interpretern automatisch, die Volume-Mappings aus der docker-compose.yml zu lesen und daraus Path Mappings abzuleiten. Das funktioniert in einfachen Fällen gut, versagt aber bei komplexen Compose-Setups mit mehreren Services oder bei Verwendung von Override-Dateien. In solchen Fällen muss man die Mappings manuell in der Interpreter-Konfiguration eintragen. Der Vorteil manueller Mappings: Sie sind explizit, nachvollziehbar und werden nicht durch Änderungen an der Compose-Datei stillschweigend ungültig.

6. Diagnose: Warum trifft mein Breakpoint nicht?

Wenn Breakpoints in PhpStorm nicht getroffen werden, obwohl Xdebug verbunden ist, sind die häufigsten Ursachen in absteigender Häufigkeit: Falscher Server-Name in PHP_IDE_CONFIG, fehlendes oder falsches Path Mapping, Breakpoint in einer gecachten Datei statt der Quelldatei, oder Xdebug im falschen Modus (xdebug.mode muss debug enthalten). PhpStorm zeigt im Debug-Fenster unter Debugger log die empfangenen Pfade vom Xdebug-Server an – das ist die wichtigste Diagnoseinformation.

Den Debugger-Log aktiviert man unter Help → Diagnostic Tools → Debug Log Settings, dann #com.jetbrains.php.debug eintragen. Nach einem neuen Xdebug-Request erscheinen in der Log-Datei die exakten Pfade, die Xdebug PhpStorm mitteilt. Vergleicht man diese mit den konfigurierten Path Mappings, sieht man sofort, ob ein Mapping fehlt oder falsch ist. Ein typischer Eintrag: received file path from debugger: /var/www/html/app/code/Mironsoft/Blog/Controller/Index.php – und das lokale Mapping muss genau /var/www/html/home/mir/development/mironsoft/src enthalten.

Symlinks sind eine häufige Ursache für Breakpoints, die nicht treffen, obwohl die Mappings auf den ersten Blick korrekt aussehen. PHP löst Symlinks standardmäßig auf und meldet Xdebug den realen Pfad, nicht den symbolischen. Wenn eine Datei unter /var/www/html/app/code/Mironsoft/Blog liegt, aber per Symlink von /home/user/modules/blog eingebunden ist, meldet Xdebug den realen Pfad /home/user/modules/blog/Controller/Index.php – und das Mapping auf /var/www/html greift nicht.

Die Lösung: Entweder den realen Pfad des Symlink-Ziels als zusätzliches Path Mapping eintragen, oder in der PHP-Konfiguration xdebug.use_compression=0 setzen und realpath_cache_size=0 in php.ini, damit PHP Symlinks nicht auflöst (nicht empfehlenswert in der Produktion). In Magento-Projekten mit Mark-Shust-Docker-Setup sind keine Symlinks nötig – direkte Volume-Mounts vermeiden das Problem vollständig.


# xdebug.ini — Vollständige Xdebug 3-Konfiguration für Docker-Magento-Projekte
[xdebug]
xdebug.mode = debug,develop
xdebug.start_with_request = trigger
xdebug.client_host = host-gateway
xdebug.client_port = 9003
xdebug.idekey = PHPSTORM
xdebug.max_nesting_level = 512
xdebug.log_level = 0

; Pfad-Auflösung: Symlinks NICHT auflösen (Vorsicht: Performance)
; xdebug.resolve_symlinks = 0

; Für CLI-Debugging (bin/magento-Befehle):
; php -d xdebug.mode=debug -d xdebug.start_with_request=yes bin/magento ...

# PHP_IDE_CONFIG in docker-compose.yml:
# PHP_IDE_CONFIG: "serverName=mironsoft-docker"
# → Muss exakt dem Server-Namen in PhpStorm → Settings → PHP → Servers entsprechen

8. Path Mappings in Magento-2-Projekten mit Docker

Im Mark-Shust-Docker-Setup für Magento 2 liegt der Magento-Root im Container unter /var/www/html. Lokal liegt er unter dem src/-Verzeichnis des Projekts. Das Path Mapping ist damit eindeutig: /home/mir/development/mironsoft/src/var/www/html. Dieses eine Mapping deckt alle Dateien ab – Magento-Core-Dateien in vendor/magento, eigene Module in app/code, Theme-Dateien in app/design und sogar die generierten Klassen in generated.

Für das Debugging von CLI-Befehlen wie bin/magento cache:flush oder eigenen Konsolenbefehlen braucht man einen separaten Run/Debug-Konfiguration in PhpStorm. Eine PHP Remote Debug-Konfiguration mit demselben Server-Namen genügt nicht – für CLI-Befehle muss man xdebug.start_with_request=yes setzen (statt trigger) und den Befehl mit der Debug-Session starten. Die Path Mappings sind dieselben wie für Web-Requests, da der CLI-PHP-Prozess im selben Container mit denselben Volume-Mounts läuft.

9. Konfigurationsszenarien im Vergleich

Je nach Entwicklungsumgebung ergeben sich unterschiedliche Konfigurationsanforderungen. Die folgende Tabelle gibt einen Überblick über die drei häufigsten Szenarien und ihre typischen Fallstricke.

Szenario Lokaler Pfad Remote-Pfad Typischer Fehler
Docker (Mark Shust) …/mironsoft/src /var/www/html Falscher serverName
Staging-Server (SSH) …/mironsoft/src /var/www/vhosts/… Falscher Deployment-Pfad
Lokales PHP …/mironsoft/src Kein Mapping nötig Trotzdem Server-Eintrag nötig
WSL2 (Windows) \\wsl$\…\src /home/…/src Pfad-Trenner-Konflikt
Mehrere Container Ein lokales Root Verschiedene Pfade Pro Container eigener Server

Ein wichtiger Grundsatz: PhpStorm braucht für jeden Xdebug-Endpunkt einen eigenen Server-Eintrag mit eigenem Namen. Wer PHP in mehreren Containern debuggt – etwa einen FPM-Container für Web-Requests und einen CLI-Container für Cronjobs – muss zwei Server-Einträge anlegen, auch wenn die Path Mappings identisch sind. PHP_IDE_CONFIG enthält dann den Namen des jeweiligen Server-Eintrags.

Mironsoft

Docker-Entwicklungsumgebungen und PhpStorm-Setup für Magento-Teams

Xdebug und Docker-Debugging endlich richtig eingerichtet?

Wir konfigurieren Ihre komplette Entwicklungsumgebung – von Docker-Compose über Xdebug-Path-Mappings bis zur vollständig integrierten PhpStorm-Konfiguration für Ihr Magento-2-Team.

Docker-Setup

Mark-Shust-Setup mit korrekter Xdebug-Konfiguration und Path-Mappings einrichten

PhpStorm-Konfiguration

Server-Einträge, Interpreter und Deployment-Mappings für das gesamte Team standardisieren

Onboarding

Reproduzierbare Entwicklungsumgebung die neue Entwickler in Minuten statt Stunden einrichtet

10. Zusammenfassung

Path Mappings in PhpStorm sind die Brücke zwischen zwei Dateisystemen. Sobald man versteht, dass Xdebug, Deployment und Remote-Interpreter alle denselben Mechanismus nutzen, wird die Konfiguration logisch und vorhersehbar. Der Server-Name in PhpStorm muss dem serverName-Wert in PHP_IDE_CONFIG entsprechen. Das Path Mapping übersetzt den lokalen Pfad in den Container- oder Server-Pfad. Ein Mapping pro Root-Verzeichnis genügt für alle Dateien darunter.

Die schnellste Diagnose bei nicht treffenden Breakpoints: Debugger-Log aktivieren, den von Xdebug gemeldeten Pfad lesen, mit den konfigurierten Mappings vergleichen. In 90% der Fälle ist die Ursache entweder ein falscher Server-Name oder ein vergessenes Mapping. Mit diesem Verständnis löst man Path-Mapping-Probleme in zwei Minuten statt zwei Stunden.

Path Mappings in PhpStorm — Das Wichtigste auf einen Blick

Server-Name

PhpStorm → Settings → PHP → Servers → Name muss exakt dem Wert von PHP_IDE_CONFIG=serverName=NAME entsprechen. Falsche Schreibweise = Breakpoints treffen nie.

Docker-Mapping

Lokaler Pfad zu src/ → Container-Pfad /var/www/html. Ein Root-Mapping genügt für alle Dateien darunter. Entspricht dem Volume-Eintrag in docker-compose.yml.

Diagnose

Help → Diagnostic Tools → Debug Log Settings → #com.jetbrains.php.debug. Log zeigt exakte Pfade vom Xdebug-Server – Vergleich mit Mapping zeigt den Fehler sofort.

Symlinks

PHP löst Symlinks zu realen Pfaden auf. Xdebug meldet reale Pfade. Symlink-Ziele als zusätzliches Mapping eintragen oder Symlinks durch direkte Volume-Mounts ersetzen.

11. FAQ: Path Mappings in PhpStorm

1Warum treffen Breakpoints nicht trotz Xdebug-Verbindung?
Häufigste Ursache: falscher Server-Name. PhpStorm-Server-Name muss exakt dem serverName-Wert in PHP_IDE_CONFIG entsprechen. Zweite Ursache: fehlendes oder falsches Path Mapping.
2Was ist PHP_IDE_CONFIG?
Umgebungsvariable im Format serverName=NAME. Teilt Xdebug mit, welchem PhpStorm-Server-Eintrag die Verbindung zugeordnet wird. Falsch gesetzt = Verbindung ohne Breakpoints.
3Wie viele Path Mappings brauche ich für Docker-Magento?
In der Regel eines: …/src/var/www/html. PhpStorm löst Unterverzeichnisse relativ dazu auf. Mehr nur bei Symlinks oder mehreren separaten Volumes.
4Wie aktiviere ich den Xdebug-Log?
Help → Diagnostic Tools → Debug Log Settings → #com.jetbrains.php.debug. Log zeigt exakte Pfade vom Xdebug-Server. Vergleich mit Mappings zeigt den Fehler sofort.
5Kann Xdebug- und Deployment-Mapping geteilt werden?
Nein – separate Konfigurationsorte in PhpStorm. Xdebug: Settings → PHP → Servers. Deployment: Settings → Build, Execution, Deployment → Deployment. Beide nutzen denselben lokalen Pfad.
6Erkennt PhpStorm Docker-Volumes automatisch?
Nur bei einfachen docker-compose.yml. Bei Override-Dateien oder mehreren Services: manuelle Konfiguration im Server-Eintrag nötig. Manuell ist sicherer – Änderungen an Compose-Dateien machen Mappings nicht stillschweigend ungültig.
7Was tun bei Symlinks die Breakpoints verhindern?
Realen Pfad des Symlink-Ziels als zusätzliches Mapping eintragen. PHP löst Symlinks auf und Xdebug meldet den realen Pfad. Alternativ: Symlinks durch direkte Volume-Mounts ersetzen.
8Wie debugge ich bin/magento-Befehle in Docker?
xdebug.start_with_request=yes setzen und Befehl im Container ausführen, während PhpStorm auf Verbindung wartet. Path Mappings identisch mit Web-Request-Debugging.
9Wie teste ich ob Deployment-Pfade korrekt sind?
Tools → Deployment → Browse Remote Host zeigt den Remote-Dateibrowser. Sofort sichtbar, ob PhpStorm den richtigen Pfad auf dem Server erreicht.
10Brauche ich pro Container einen eigenen Server-Eintrag?
Ja, wenn mehrere Container Xdebug-Verbindungen senden. Jeder Container braucht eigenen Server-Eintrag mit eindeutigem Namen und passendem PHP_IDE_CONFIG-Wert.