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:
- ini di sviluppo in produzione:
display_errorsè attivato inphp.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. - File di prova dimenticati: file
phpinfo(), dump di database o file.envcon credenziali non appartengono al deployment. - Server di sviluppo aperti:
php -So container con porte pubblicate su computer in rete. - 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.
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.