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:
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.
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:
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 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:
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:
# .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:
- Ontwikkel-ini in productie:
display_errorsstaat inphp.ini-developmentaan. Belandt dit bestand op de server, dan zien bezoekers paden en foutmeldingen. Zie Foutweergave in productie uitschakelen. - Vergeten testbestanden:
phpinfo()-bestanden, database-dumps of.env-bestanden met toegangsgegevens horen niet in de deployment. - Open ontwikkelservers:
php -Sof containers met gepubliceerde poorten op computers in het netwerk. - 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.
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 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.