Situazione attuale: PHP2Shell. Due vulnerabilità critiche di PHP (CVSS 9,2) consentono codice dannoso senza autenticazione. Patch dal 21/10/2026.Che cosa fare ora →

Sviluppare PHP in locale: Docker, DDEV e simili

Per lo sviluppo PHP in locale esistono il server web integrato, le immagini Docker ufficiali e strumenti come DDEV. L'importante è che in locale giri la stessa versione di PHP che gira online.

Stato 5 min di letturaConoscere PHP

In breve: per sviluppare PHP in locale esistono tre vie diffuse: il server web integrato (php -S) per prove rapide, le immagini Docker ufficiali di PHP per ambienti riproducibili e strumenti come DDEV, che creano ambienti di progetto già pronti per WordPress, TYPO3, Shopware o Laravel. Decisiva è meno lo strumento che la corrispondenza: in locale dovrebbe girare la stessa versione di PHP con le stesse estensioni che girano online. Per la sicurezza conta però sempre, alla fine, il runtime sul server.

Perché un ambiente di sviluppo proprio?

Apportare modifiche direttamente sul server live è rischioso: ogni errore di battitura è subito visibile ai clienti, e i file di prova tendono a restare. Un ambiente locale separa la sperimentazione dall'esercizio. È al tempo stesso il luogo in cui le nuove versioni di PHP e gli aggiornamenti di sicurezza vengono testati per primi.

Per la direzione e per la responsabile IT la domanda non è dunque se esista un ambiente di sviluppo, ma se corrisponda al sistema live. Un ambiente locale con PHP 8.4, mentre online gira ancora la 8.1, nasconde i problemi invece di mostrarli. Lo stesso vale per la versione del database, per il server web e per estensioni come intl, gd o pdo_mysql: basta un'estensione mancante perché un errore emerga solo online.

Le opzioni in sintesi

Opzione Adatta per Punti di forza Limiti
Server integrato php -S prove brevi, piccoli script senza installare altro software non sostituisce Nginx o Apache, non per reti pubbliche
Immagine Docker ufficiale team, ambienti riproducibili versione definibile tramite tag, vicina all'esercizio in container configurazione e interazione di più container da costruire da sé
DDEV progetti CMS e framework tipi di progetto pronti, database e server web inclusi richiede Docker, convenzioni proprie
PHP installato localmente singoli sviluppatori rapido, diretto difficile mantenere in parallelo le versioni di più progetti

Il server web integrato

Da PHP 5.4 la riga di comando include un piccolo server web. Si avvia nella directory corrente oppure, con -t, in un'altra directory dei documenti:

php -S localhost:8000 -t public/

Facoltativamente si passa uno script router, che a ogni richiesta viene eseguito per primo. Il manuale è inequivocabile nella classificazione: il server deve supportare lo sviluppo, non è un server web completo e non deve essere usato in una rete pubblica. Lo leghi quindi a localhost, non a 0.0.0.0, altrimenti può essere raggiungibile nella rete Wi-Fi aziendale o dell'hotel. Altro sulla riga di comando in PHP dalla riga di comando.

Docker: immagini PHP ufficiali

Le immagini ufficiali esistono in diverse varianti: cli per la riga di comando, apache con Apache e mod_php, fpm per l'esercizio dietro Nginx o un altro proxy, oltre alle varianti Alpine per immagini piccole. Un avvio rapido con Apache:

docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache

Le immagini contengono i modelli php.ini-development e php.ini-production nella directory $PHP_INI_DIR. In locale ha senso il modello di sviluppo, perché mostra gli errori. Per la produzione la documentazione dell'immagine raccomanda espressamente il modello di produzione. Le estensioni si installano con gli script di supporto forniti docker-php-ext-configure, docker-php-ext-install e docker-php-ext-enable. Come funzionano tag e digest lo spiega Immagini Docker ufficiali di PHP.

DDEV: ambienti pronti per CMS e framework

DDEV si basa su Docker e configura per un progetto server web, PHP, database e servizi di supporto. Le guide di avvio rapido seguono quasi sempre lo stesso schema:

ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch

Come tipi di progetto DDEV conosce, tra gli altri, wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 e il tipo generico php. La versione di PHP si definisce in .ddev/config.yaml; secondo la documentazione sono possibili le versioni dalla 5.6 alla 8.5, il valore predefinito è 8.4:

# .ddev/config.yaml (estratto)
php_version: "8.3"
webserver_type: nginx-fpm   # in alternativa apache-fpm

Così l'ambiente locale corrisponde alla versione live, anche se questa non è ancora la più recente.

Sviluppo locale, stato delle patch e PHP2Shell

Dopo PHP2Shell diversi fornitori di piattaforme hanno richiamato l'attenzione su un tipico errore di ragionamento. Vercel sottolinea, secondo il bollettino, che non basta aggiornare l'ambiente di sviluppo locale, il codice dell'applicazione o i plugin; decisivo è il runtime PHP che effettivamente serve le pagine. Avere in locale PHP 8.4.27 non protegge il server con la 8.4.26.

All'inverso, l'ambiente di sviluppo porta con sé rischi propri, che possono passare in produzione:

  1. ini di sviluppo in produzione: display_errors è attivato in php.ini-development. Se questo file arriva sul server, i visitatori vedono percorsi e messaggi di errore. Si veda Disattivare la visualizzazione degli errori in produzione.
  2. File di prova dimenticati: file phpinfo(), dump di database o file .env con credenziali non appartengono al deployment.
  3. Server di sviluppo aperti: php -S o container con porte pubblicate su computer in rete.
  4. Immagini obsolete: le immagini locali non si aggiornano da sole; dopo un rilascio di sicurezza di PHP anche l'ambiente di sviluppo va ricostruito, perché i test girino con la versione corretta.
Consiglio

Definisca la versione di PHP in un unico punto, ad esempio nel Dockerfile o in .ddev/config.yaml, e la modifichi negli aggiornamenti insieme alla configurazione del server.

Come aiuta concretamente PHP SOS?

Nel contratto di manutenzione della sicurezza facciamo in modo che sviluppo ed esercizio siano coerenti:

  • Confronto: confrontiamo versione di PHP ed estensioni degli ambienti di sviluppo, test e live.
  • Procedura di aggiornamento: le nuove release di PHP vengono installate prima nell'ambiente di test, poi online, ogni volta con riavvio.
  • Verifica del deployment: facciamo attenzione che sul server non arrivino ini di sviluppo, file di prova o credenziali.
  • Documentazione: sa in ogni momento quale versione gira dove.

Domande frequenti

Posso usare pubblicamente il server web integrato di PHP?

No. Il manuale PHP dice espressamente che il server avviato con php -S serve allo sviluppo e non deve essere usato in una rete pubblica. Per l'esercizio servono PHP-FPM con Nginx o Apache.

Che cos'è DDEV?

DDEV è uno strumento basato su Docker che crea ambienti di sviluppo già pronti per progetti PHP. Conosce tipi di progetto per WordPress, TYPO3, Shopware 6, Laravel, Drupal e altri sistemi.

Basta aggiornare la versione di PHP in locale?

No. Contro vulnerabilità come PHP2Shell conta il runtime PHP che effettivamente serve le pagine, cioè quello sul server. L'ambiente locale dovrebbe però avere la stessa versione, perché i test siano significativi.

Quale php.ini uso in locale?

In locale ha senso php.ini-development, perché mostra gli errori. In produzione va usato php.ini-production. Le immagini Docker ufficiali includono entrambi i modelli.

Fonti

Contatto immediato

Ogni ora conta. Ci scriva adesso.

Descriva brevemente sistema, versione di PHP e quanto osservato. Ci faremo sentire, chiariremo la situazione e lavoreremo da remoto fino alla chiusura e alla documentazione dell'incidente.

Aiuto immediato