# PHP lokal entwickeln: Docker, DDEV und Co.

> PHP lokal entwickeln mit eingebautem Server, Docker oder DDEV: Stärken, Grenzen, Beispiele und wie Entwicklung und Produktion beim Patchstand gleich bleiben.

Quelle: https://phpsos.de/php/php-lokal-entwickeln/  
Stand: 25.10.2026  
Anbieter: PHP SOS, PHP-Notfallhilfe und Server-Sicherheit. Soforthilfe per WhatsApp: https://wa.me/491736494914?text=Hallo%20PHP%20SOS%2C%20wir%20brauchen%20Hilfe%20mit%20unserem%20PHP-Server.%20Firma%3A%20%E2%80%A6%20Website%3A%20%E2%80%A6

**Kurz gesagt:** Um PHP lokal zu entwickeln, gibt es drei gängige Wege: den eingebauten Webserver (`php -S`) für schnelle Versuche, die offiziellen PHP-Docker-Images für nachbaubare Umgebungen und Werkzeuge wie DDEV, die fertige Projektumgebungen für WordPress, TYPO3, Shopware oder Laravel erzeugen. Entscheidend ist weniger das Werkzeug als die Übereinstimmung: Lokal sollte dieselbe PHP-Version mit denselben Erweiterungen laufen wie live. Für die Sicherheit zählt am Ende aber immer die Laufzeit auf dem Server.

## Warum eine eigene Entwicklungsumgebung?

Änderungen direkt auf dem Live-Server zu machen, ist riskant: Jeder Tippfehler ist sofort für Kunden sichtbar, und Testdateien bleiben gern liegen. Eine lokale Umgebung trennt Ausprobieren von Betrieb. Sie ist zugleich der Ort, an dem neue PHP-Versionen und Sicherheitsupdates zuerst getestet werden.

Für Geschäftsführung und IT-Leitung ist die Frage daher nicht, ob es eine Entwicklungsumgebung gibt, sondern ob sie dem Live-System entspricht. Eine lokale Umgebung mit PHP 8.4, während live noch 8.1 läuft, verschleiert Probleme statt sie zu zeigen. Dasselbe gilt für Datenbankversion, Webserver und Erweiterungen wie `intl`, `gd` oder `pdo_mysql`: Schon eine fehlende Erweiterung kann dazu führen, dass ein Fehler erst live auffällt.

## Die Optionen im Überblick

| Option | Geeignet für | Stärken | Grenzen |
|---|---|---|---|
| Eingebauter Server `php -S` | kurze Versuche, kleine Skripte | ohne Installation weiterer Software | kein Ersatz für Nginx oder Apache, nicht für öffentliche Netze |
| Offizielles Docker-Image | Teams, nachbaubare Umgebungen | Version per Tag festlegbar, nah an Container-Betrieb | Konfiguration und Zusammenspiel mehrerer Container selbst bauen |
| DDEV | CMS- und Framework-Projekte | fertige Projekttypen, Datenbank und Webserver inklusive | setzt Docker voraus, eigene Konventionen |
| Lokal installiertes PHP | Einzelentwickler | schnell, direkt | Versionen mehrerer Projekte schwer parallel zu halten |

## Der eingebaute Webserver

Seit PHP 5.4 enthält die Kommandozeile einen kleinen Webserver. Er startet im aktuellen Verzeichnis oder mit `-t` in einem anderen Dokumentenverzeichnis:

```bash
php -S localhost:8000 -t public/
```

Optional übergeben Sie ein Router-Skript, das bei jeder Anfrage zuerst läuft. Das Handbuch ist bei der Einordnung eindeutig: Der Server soll die Entwicklung unterstützen, ist kein vollwertiger Webserver und soll nicht in einem öffentlichen Netz verwendet werden. Binden Sie ihn deshalb an `localhost`, nicht an `0.0.0.0`, sonst ist er unter Umständen im Firmen- oder Hotel-WLAN erreichbar. Mehr zur Kommandozeile unter [PHP auf der Kommandozeile](https://phpsos.de/php/php-cli/).

## Docker: offizielle PHP-Images

Die offiziellen Images gibt es in mehreren Varianten: `cli` für die Kommandozeile, `apache` mit Apache und mod_php, `fpm` für den Betrieb hinter Nginx oder einem anderen Proxy, dazu Alpine-Varianten für kleine Images. Ein schneller Start mit Apache:

```bash
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
```

Die Images enthalten die Vorlagen `php.ini-development` und `php.ini-production` im Verzeichnis `$PHP_INI_DIR`. Lokal ist die Entwicklungsvorlage sinnvoll, weil sie Fehler anzeigt. Für Produktion empfiehlt die Image-Dokumentation ausdrücklich die Produktionsvorlage. Erweiterungen installieren Sie mit den mitgelieferten Hilfsskripten `docker-php-ext-configure`, `docker-php-ext-install` und `docker-php-ext-enable`. Wie Tags und Digests funktionieren, erklärt [Offizielle PHP-Docker-Images](https://phpsos.de/blog/offizielle-php-docker-images/).

## DDEV: fertige Umgebungen für CMS und Frameworks

DDEV baut auf Docker auf und richtet für ein Projekt Webserver, PHP, Datenbank und Hilfsdienste ein. Die Schnellstartanleitungen folgen fast immer demselben Muster:

```bash
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
```

Als Projekttypen kennt DDEV unter anderem `wordpress`, `typo3`, `shopware6`, `laravel`, `symfony`, `drupal11`, `magento2` und den allgemeinen Typ `php`. Die PHP-Version legen Sie in `.ddev/config.yaml` fest; laut Dokumentation sind Versionen von 5.6 bis 8.5 möglich, Standard ist 8.4:

```yaml
# .ddev/config.yaml (Auszug)
php_version: "8.3"
webserver_type: nginx-fpm   # alternativ apache-fpm
```

So entspricht die lokale Umgebung der Live-Version, auch wenn diese noch nicht die neueste ist.

## Lokale Entwicklung, Patchstand und PHP2Shell

Nach PHP2Shell haben mehrere Plattformanbieter auf einen typischen Denkfehler hingewiesen. Vercel betont laut Bulletin, dass ein Update der lokalen Entwicklungsumgebung, des Anwendungscodes oder der Plugins nicht reicht; entscheidend ist die PHP-Laufzeit, die tatsächlich ausliefert. Lokal PHP 8.4.27 zu haben, schützt den Server mit 8.4.26 nicht.

Umgekehrt bringt die Entwicklungsumgebung eigene Risiken mit, die in die Produktion wandern können:

1. **Entwicklungs-ini in der Produktion:** `display_errors` ist in `php.ini-development` eingeschaltet. Gelangt diese Datei auf den Server, sehen Besucher Pfade und Fehlermeldungen. Siehe [Fehlerausgaben in der Produktion abschalten](https://phpsos.de/blog/display-errors-produktion/).
2. **Vergessene Testdateien:** `phpinfo()`-Dateien, Datenbank-Dumps oder `.env`-Dateien mit Zugangsdaten gehören nicht ins Deployment.
3. **Offene Entwicklungsserver:** `php -S` oder Container mit veröffentlichten Ports auf Rechnern im Netz.
4. **Veraltete Images:** Lokale Images werden nicht von selbst aktualisiert; nach einem PHP-Sicherheitsrelease gehört auch die Entwicklungsumgebung neu gebaut, damit Tests mit der korrigierten Version laufen.

> **Tipp:**
> Legen Sie die PHP-Version an einer Stelle fest, etwa im Dockerfile oder in `.ddev/config.yaml`, und ändern Sie sie bei Updates gemeinsam mit der Serverkonfiguration.

## Wie hilft PHP SOS konkret?

Im [Security-Wartungsvertrag](https://phpsos.de/leistungen/security-wartungsvertrag/) sorgen wir dafür, dass Entwicklung und Betrieb zusammenpassen:

- **Abgleich:** Wir vergleichen PHP-Version und Erweiterungen von Entwicklungs-, Test- und Live-Umgebung.
- **Update-Ablauf:** Neue PHP-Releases werden zuerst in der Testumgebung eingespielt, dann live, jeweils mit Neustart.
- **Deployment prüfen:** Wir achten darauf, dass keine Entwicklungs-ini, Testdateien oder Zugangsdaten auf den Server gelangen.
- **Dokumentation:** Sie wissen jederzeit, welche Version wo läuft.


## Häufige Fragen

**Darf ich den eingebauten PHP-Webserver öffentlich nutzen?**  
Nein. Das PHP-Handbuch sagt ausdrücklich, dass der mit php -S gestartete Server der Entwicklung dient und nicht in einem öffentlichen Netz verwendet werden soll. Für den Betrieb gehören PHP-FPM mit Nginx oder Apache dazu.

**Was ist DDEV?**  
DDEV ist ein Werkzeug, das auf Docker aufbaut und fertige Entwicklungsumgebungen für PHP-Projekte erzeugt. Es kennt Projekttypen für WordPress, TYPO3, Shopware 6, Laravel, Drupal und weitere Systeme.

**Reicht es, die lokale PHP-Version zu aktualisieren?**  
Nein. Gegen Lücken wie PHP2Shell zählt die PHP-Laufzeit, die tatsächlich ausliefert, also die auf dem Server. Die lokale Umgebung sollte aber dieselbe Version haben, damit Tests aussagekräftig sind.

**Welche php.ini nutze ich lokal?**  
Lokal ist php.ini-development sinnvoll, weil sie Fehler anzeigt. In der Produktion gehört php.ini-production verwendet. Die offiziellen Docker-Images bringen beide Vorlagen mit.

## Quellen

- [PHP-Handbuch: Eingebauter Webserver](https://www.php.net/manual/en/features.commandline.webserver.php)
- [Docker Official Image: PHP](https://hub.docker.com/_/php)
- [DDEV](https://ddev.com/)
