# PHP lokaal ontwikkelen: Docker, DDEV en meer

> PHP lokaal ontwikkelen met de ingebouwde server, Docker of DDEV: sterke punten, grenzen, voorbeelden en hoe ontwikkeling en productie qua patchstatus gelijk blijven.

Bron: https://phpsos.de/nl/php/php-lokal-entwickeln/  
Stand: 25-10-2026  
Aanbieder: PHP SOS, PHP-noodhulp en serverbeveiliging. Directe hulp via WhatsApp: https://wa.me/491736494914?text=Hallo%20PHP%20SOS%2C%20wij%20hebben%20hulp%20nodig%20met%20onze%20PHP-server.%20Bedrijf%3A%20%E2%80%A6%20Website%3A%20%E2%80%A6

**Kort gezegd:** Om PHP lokaal te ontwikkelen zijn er drie gangbare wegen: de ingebouwde webserver (`php -S`) voor snelle proeven, de officiële PHP-Docker-images voor reproduceerbare omgevingen en hulpmiddelen zoals DDEV, die kant-en-klare projectomgevingen voor WordPress, TYPO3, Shopware of Laravel genereren. Beslissend is minder het hulpmiddel dan de overeenkomst: lokaal moet dezelfde PHP-versie met dezelfde extensies draaien als live. Voor de beveiliging telt uiteindelijk altijd de runtime op de server.

## Waarom een eigen ontwikkelomgeving?

Wijzigingen rechtstreeks op de live-server doorvoeren is riskant: elke typefout is meteen zichtbaar voor klanten en testbestanden blijven graag liggen. Een lokale omgeving scheidt uitproberen van bedrijf. Ze is tegelijk de plek waar nieuwe PHP-versies en beveiligingsupdates het eerst worden getest.

Voor directie en IT-leiding is de vraag daarom niet of er een ontwikkelomgeving is, maar of ze overeenkomt met het live-systeem. Een lokale omgeving met PHP 8.4, terwijl live nog 8.1 draait, verhult problemen in plaats van ze te tonen. Hetzelfde geldt voor databaseversie, webserver en extensies zoals `intl`, `gd` of `pdo_mysql`: al een ontbrekende extensie kan ertoe leiden dat een fout pas live opvalt.

## De opties in een overzicht

| Optie | Geschikt voor | Sterke punten | Grenzen |
|---|---|---|---|
| Ingebouwde server `php -S` | korte proeven, kleine scripts | zonder installatie van verdere software | geen vervanging van Nginx of Apache, niet voor openbare netwerken |
| Officiële Docker-image | teams, reproduceerbare omgevingen | versie via tag vast te leggen, dicht bij containerbedrijf | configuratie en samenspel van meerdere containers zelf bouwen |
| DDEV | CMS- en frameworkprojecten | kant-en-klare projecttypen, database en webserver inbegrepen | vereist Docker, eigen conventies |
| Lokaal geïnstalleerd PHP | individuele ontwikkelaars | snel, direct | versies van meerdere projecten moeilijk parallel te houden |

## De ingebouwde webserver

Sinds PHP 5.4 bevat de opdrachtregel een kleine webserver. Hij start in de huidige map of met `-t` in een andere documentmap:

```bash
php -S localhost:8000 -t public/
```

Optioneel geeft u een routerscript mee dat bij elk verzoek eerst draait. De handleiding is bij de indeling eenduidig: de server moet de ontwikkeling ondersteunen, is geen volwaardige webserver en mag niet in een openbaar netwerk worden gebruikt. Bind hem daarom aan `localhost`, niet aan `0.0.0.0`, anders is hij onder omstandigheden bereikbaar in het bedrijfs- of hotel-wifi. Meer over de opdrachtregel onder [PHP op de opdrachtregel](https://phpsos.de/nl/php/php-cli/).

## Docker: officiële PHP-images

De officiële images zijn er in meerdere varianten: `cli` voor de opdrachtregel, `apache` met Apache en mod_php, `fpm` voor bedrijf achter Nginx of een andere proxy, plus Alpine-varianten voor kleine images. Een snelle start met Apache:

```bash
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
```

De images bevatten de sjablonen `php.ini-development` en `php.ini-production` in de map `$PHP_INI_DIR`. Lokaal is het ontwikkelsjabloon zinvol, omdat het fouten toont. Voor productie adviseert de imagedocumentatie uitdrukkelijk het productiesjabloon. Extensies installeert u met de meegeleverde hulpscripts `docker-php-ext-configure`, `docker-php-ext-install` en `docker-php-ext-enable`. Hoe tags en digests werken, legt [Officiële PHP-Docker-images](https://phpsos.de/nl/blog/offizielle-php-docker-images/) uit.

## DDEV: kant-en-klare omgevingen voor CMS en frameworks

DDEV bouwt voort op Docker en richt voor een project webserver, PHP, database en hulpdiensten in. De snelstartgidsen volgen bijna altijd hetzelfde patroon:

```bash
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
```

Als projecttypen kent DDEV onder meer `wordpress`, `typo3`, `shopware6`, `laravel`, `symfony`, `drupal11`, `magento2` en het algemene type `php`. De PHP-versie legt u vast in `.ddev/config.yaml`; volgens de documentatie zijn versies van 5.6 tot 8.5 mogelijk, de standaard is 8.4:

```yaml
# .ddev/config.yaml (uittreksel)
php_version: "8.3"
webserver_type: nginx-fpm   # alternatief apache-fpm
```

Zo komt de lokale omgeving overeen met de live-versie, ook als die nog niet de nieuwste is.

## Lokale ontwikkeling, patchstatus en PHP2Shell

Na PHP2Shell hebben meerdere platformaanbieders gewezen op een typische denkfout. Vercel benadrukt volgens de bulletin dat een update van de lokale ontwikkelomgeving, de toepassingscode of de plugins niet volstaat; beslissend is de PHP-runtime die daadwerkelijk uitlevert. Lokaal PHP 8.4.27 hebben, beschermt de server met 8.4.26 niet.

Omgekeerd brengt de ontwikkelomgeving eigen risico's mee die naar productie kunnen doorsijpelen:

1. **Ontwikkel-ini in productie:** `display_errors` staat in `php.ini-development` aan. Belandt dit bestand op de server, dan zien bezoekers paden en foutmeldingen. Zie [Foutweergave in productie uitschakelen](https://phpsos.de/nl/blog/display-errors-produktion/).
2. **Vergeten testbestanden:** `phpinfo()`-bestanden, database-dumps of `.env`-bestanden met toegangsgegevens horen niet in de deployment.
3. **Open ontwikkelservers:** `php -S` of containers met gepubliceerde poorten op computers in het netwerk.
4. **Verouderde images:** Lokale images worden niet vanzelf bijgewerkt; na een PHP-beveiligingsrelease moet ook de ontwikkelomgeving opnieuw worden gebouwd, zodat tests met de gecorrigeerde versie draaien.

> **Tip:**
> Leg de PHP-versie op één plek vast, bijvoorbeeld in het Dockerfile of in `.ddev/config.yaml`, en wijzig haar bij updates samen met de serverconfiguratie.

## Hoe helpt PHP SOS concreet?

In het [security-onderhoudscontract](https://phpsos.de/nl/leistungen/security-wartungsvertrag/) zorgen wij ervoor dat ontwikkeling en bedrijf bij elkaar passen:

- **Vergelijking:** Wij vergelijken PHP-versie en extensies van ontwikkel-, test- en live-omgeving.
- **Updateverloop:** Nieuwe PHP-releases worden eerst in de testomgeving doorgevoerd, dan live, telkens met herstart.
- **Deployment controleren:** Wij letten erop dat er geen ontwikkel-ini, testbestanden of toegangsgegevens op de server terechtkomen.
- **Documentatie:** U weet op elk moment welke versie waar draait.


## Veelgestelde vragen

**Mag ik de ingebouwde PHP-webserver openbaar gebruiken?**  
Nee. De PHP-handleiding zegt uitdrukkelijk dat de met php -S gestarte server voor ontwikkeling dient en niet in een openbaar netwerk mag worden gebruikt. Voor bedrijf horen PHP-FPM met Nginx of Apache.

**Wat is DDEV?**  
DDEV is een hulpmiddel dat op Docker voortbouwt en kant-en-klare ontwikkelomgevingen voor PHP-projecten genereert. Het kent projecttypen voor WordPress, TYPO3, Shopware 6, Laravel, Drupal en andere systemen.

**Is het voldoende om de lokale PHP-versie bij te werken?**  
Nee. Tegen lekken zoals PHP2Shell telt de PHP-runtime die daadwerkelijk uitlevert, dus die op de server. De lokale omgeving moet wel dezelfde versie hebben, zodat tests betekenisvol zijn.

**Welke php.ini gebruik ik lokaal?**  
Lokaal is php.ini-development zinvol, omdat ze fouten toont. In productie hoort php.ini-production te worden gebruikt. De officiële Docker-images bevatten beide sjablonen.

## Bronnen

- [PHP-handleiding: ingebouwde webserver](https://www.php.net/manual/en/features.commandline.webserver.php)
- [Docker Official Image: PHP](https://hub.docker.com/_/php)
- [DDEV](https://ddev.com/)
