Kort sagt: För att utveckla PHP lokalt finns tre gängse vägar: den inbyggda webbservern (php -S) för snabba försök, de officiella PHP-Docker-images för återskapbara miljöer och verktyg som DDEV, vilka skapar färdiga projektmiljöer för WordPress, TYPO3, Shopware eller Laravel. Avgörande är mindre verktyget än överensstämmelsen: Lokalt bör samma PHP-version med samma tillägg köras som live. För säkerheten räknas i slutändan alltid körmiljön på servern.
Varför en egen utvecklingsmiljö?
Att göra ändringar direkt på live-servern är riskabelt: Varje tryckfel syns genast för kunderna, och testfiler blir gärna liggande. En lokal miljö skiljer provande från drift. Den är samtidigt platsen där nya PHP-versioner och säkerhetsuppdateringar testas först.
För ledning och IT-chefer är frågan därför inte om det finns en utvecklingsmiljö utan om den motsvarar live-systemet. En lokal miljö med PHP 8.4 medan live fortfarande kör 8.1 döljer problem i stället för att visa dem. Detsamma gäller databasversion, webbserver och tillägg som intl, gd eller pdo_mysql: Redan ett saknat tillägg kan göra att ett fel först märks live.
Alternativen i överblick
| Alternativ | Lämpligt för | Styrkor | Gränser |
|---|---|---|---|
Inbyggd server php -S |
korta försök, små skript | utan installation av ytterligare programvara | ingen ersättning för Nginx eller Apache, inte för offentliga nät |
| Officiell Docker-image | team, återskapbara miljöer | version fastlagd via tagg, nära containerdrift | konfiguration och samspel mellan flera containrar byggs själv |
| DDEV | CMS- och ramverksprojekt | färdiga projekttyper, databas och webbserver ingår | kräver Docker, egna konventioner |
| Lokalt installerad PHP | enskilda utvecklare | snabbt, direkt | svårt att hålla flera projekts versioner parallellt |
Den inbyggda webbservern
Sedan PHP 5.4 innehåller kommandoraden en liten webbserver. Den startar i den aktuella katalogen eller med -t i en annan dokumentkatalog:
php -S localhost:8000 -t public/
Valfritt anger ni ett routerskript som körs först vid varje förfrågan. Manualen är tydlig i bedömningen: Servern ska stödja utveckling, är ingen fullvärdig webbserver och ska inte användas i ett offentligt nät. Bind den därför till localhost, inte till 0.0.0.0, annars kan den under omständigheter nås i företagets eller hotellets wifi. Mer om kommandoraden under PHP på kommandoraden.
Docker: officiella PHP-images
De officiella images finns i flera varianter: cli för kommandoraden, apache med Apache och mod_php, fpm för drift bakom Nginx eller en annan proxy, dessutom Alpine-varianter för små images. En snabb start med Apache:
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
Images innehåller mallarna php.ini-development och php.ini-production i katalogen $PHP_INI_DIR. Lokalt är utvecklingsmallen lämplig, eftersom den visar fel. För produktion rekommenderar image-dokumentationen uttryckligen produktionsmallen. Tillägg installerar ni med de medföljande hjälpskripten docker-php-ext-configure, docker-php-ext-install och docker-php-ext-enable. Hur taggar och digests fungerar förklarar Officiella PHP-Docker-images.
DDEV: färdiga miljöer för CMS och ramverk
DDEV bygger på Docker och ställer för ett projekt in webbserver, PHP, databas och hjälptjänster. Snabbstartsanvisningarna följer nästan alltid samma mönster:
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
Som projekttyper känner DDEV bland annat till wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 och den allmänna typen php. PHP-versionen fastlägger ni i .ddev/config.yaml; enligt dokumentationen är versioner från 5.6 till 8.5 möjliga, standard är 8.4:
# .ddev/config.yaml (utdrag)
php_version: "8.3"
webserver_type: nginx-fpm # alternativt apache-fpm
Så motsvarar den lokala miljön live-versionen, även om den ännu inte är den nyaste.
Lokal utveckling, patchläge och PHP2Shell
Efter PHP2Shell har flera plattformsleverantörer pekat på ett typiskt tankefel. Vercel betonar enligt sitt bulletin att en uppdatering av den lokala utvecklingsmiljön, av applikationskoden eller av pluginen inte räcker; avgörande är den PHP-körmiljö som faktiskt levererar. Att ha PHP 8.4.27 lokalt skyddar inte servern som kör 8.4.26.
Omvänt för utvecklingsmiljön med sig egna risker som kan vandra in i produktionen:
- Utvecklings-ini i produktion:
display_errorsär påslagen iphp.ini-development. Hamnar den filen på servern ser besökare sökvägar och felmeddelanden. Se Stäng av felutskrifter i produktion. - Bortglömda testfiler:
phpinfo()-filer, databasdumpar eller.env-filer med inloggningsuppgifter hör inte hemma i driftsättningen. - Öppna utvecklingsservrar:
php -Seller containrar med publicerade portar på datorer i nätet. - Föråldrade images: Lokala images uppdateras inte av sig själva; efter en PHP-säkerhetsrelease bör även utvecklingsmiljön byggas om, så att testerna körs med den rättade versionen.
Fastlägg PHP-versionen på ett ställe, till exempel i Dockerfile eller i .ddev/config.yaml, och ändra den vid uppdateringar tillsammans med serverkonfigurationen.
Hur hjälper PHP SOS konkret?
Inom säkerhetsunderhållsavtalet ser vi till att utveckling och drift passar ihop:
- Avstämning: Vi jämför PHP-version och tillägg i utvecklings-, test- och live-miljön.
- Uppdateringsförlopp: Nya PHP-releaser installeras först i testmiljön, sedan live, i båda fallen med omstart.
- Kontrollera driftsättningen: Vi ser till att ingen utvecklings-ini, inga testfiler eller inloggningsuppgifter hamnar på servern.
- Dokumentation: Ni vet alltid vilken version som körs var.
Vanliga frågor
Får jag använda PHP:s inbyggda webbserver offentligt?
Nej. PHP-manualen säger uttryckligen att servern som startas med php -S är till för utveckling och inte ska användas i ett offentligt nät. För drift hör PHP-FPM med Nginx eller Apache hemma.
Vad är DDEV?
DDEV är ett verktyg som bygger på Docker och skapar färdiga utvecklingsmiljöer för PHP-projekt. Det känner till projekttyper för WordPress, TYPO3, Shopware 6, Laravel, Drupal och fler system.
Räcker det att uppdatera den lokala PHP-versionen?
Nej. Mot luckor som PHP2Shell räknas den PHP-körmiljö som faktiskt levererar, alltså den på servern. Den lokala miljön bör dock ha samma version, så att testerna blir tillförlitliga.
Vilken php.ini använder jag lokalt?
Lokalt är php.ini-development lämplig, eftersom den visar fel. I produktion ska php.ini-production användas. De officiella Docker-images har båda mallarna med sig.