Mantenere l'infrastruttura di build di PHP per Windows: strumenti per build e aggiornamenti di sicurezza
La maggior parte degli sviluppatori PHP non pensa mai a come viene compilato PHP. Lo scaricano, lo installano con un comando o con un'immagine precompilata e iniziano a lavorare. Ed è esattamente così che dovrebbe essere. Un sistema di build sta facendo il suo lavoro quando il risultato finale appare ottimo e funziona come previsto.
Dietro ogni rilascio ufficiale di PHP per Windows c'è molta infrastruttura: compilatori, SDK, librerie di dipendenze, compatibilità delle estensioni, pipeline CI e aggiornamenti di sicurezza che mantengono funzionanti le versioni PHP supportate.
Nell'ambito del mio lavoro per The PHP Foundation, l'attenzione si è concentrata sul lato Windows di PHP: mantenere e migliorare l'infrastruttura di build, aggiornare le dipendenze, supportare le build delle estensioni e rendere il processo più affidabile per le release PHP attuali e future.
Questo post è uno sguardo a quel lavoro, al perché è importante e a cosa comporta mantenere PHP in salute su Windows.
Perché il supporto a Windows conta ancora
PHP è ampiamente utilizzato su Linux, dato che il caso d'uso più comune è l'esecuzione di applicazioni web, ma il supporto a Windows resta importante per diverse ragioni.
Molti sviluppatori usano Windows come ambiente di sviluppo locale, e molte aziende eseguono applicazioni PHP su server Windows. Numerosi utenti ne dipendono per ambienti di test locali, strumenti CLI ed estensioni che devono funzionare in modo affidabile su Windows. Secondo il sondaggio annuale sugli sviluppatori di Stack Overflow del 2025 quasi il 50% degli intervistati usa Windows per lo sviluppo.
Le build ufficiali di PHP per Windows sono importanti perché forniscono una base di riferimento affidabile e fanno parte del processo di rilascio del progetto PHP.
Ciò significa che il supporto a Windows non riguarda solo la produzione della build finale di PHP. Riguarda il mantenimento dell'intera catena che rende possibile un runtime PHP affidabile.
Il sistema di build è ora una toolchain
Compilare PHP su Windows è molto diverso dal compilarlo su sistemi Unix-like.
Su Linux e macOS, compilare PHP di solito dipende da package manager per le dipendenze e da toolchain di build popolari e facili da usare. Su Windows, PHP utilizza un sistema di build separato costruito attorno a MSVC, Windows SDK che gestisce varie versioni di MSVC, script di build personalizzati e dipendenze precompilate personalizzate con patch specifiche per PHP.
Una build di PHP per Windows deve sapere:
- Quale toolset di Visual Studio usare
- Quale Windows SDK targetizzare
- Quali pacchetti di dipendenze sono disponibili
- Quali versioni delle librerie sono compatibili con ciascun branch di PHP
- Se una build è x64, x86, thread-safe, non-thread-safe, debug o release
Una parte importante del mio lavoro è stata consolidare tutto questo in una toolchain moderna: php/php-windows-builder.
Build delle estensioni PHP per Windows
Abbiamo iniziato con lo scopo di rendere più semplice compilare estensioni PHP su Windows. L'obiettivo era dare agli autori di estensioni un percorso per produrre build compatibili con la nuova direzione di PIE. Ma poiché questo nuovo modo di distribuire le estensioni di PHP tramite PIE è ancora in evoluzione, abbiamo anche ripristinato le build Windows per i rilasci delle estensioni su PECL. Nell'ambito di questo lavoro, abbiamo pubblicato build per più di 100 estensioni attivamente mantenute.
Questo è importante perché le build delle estensioni per Windows sono state storicamente problematiche per i maintainer. Gli autori di estensioni spesso non hanno l'ambiente di build Windows completo in locale, e molti contributori hanno più familiarità con i flussi di lavoro basati su Linux. Un builder con un'interfaccia unificata e input noti offre all'ecosistema un punto comune dove testare, fare debug e migliorare le build Windows.
- name: Build the extension
uses: php/php-windows-builder/extension@v1
with:
extension-url: https://github.com/xdebug/xdebug
extension-ref: '3.5.3'
php-version: '8.5'
ts: nts
arch: x64
args: --with-xdebug
libs: zlib
Non si tratta solo di comodità. Cambia ciò che è possibile fare. Per la maggior parte delle estensioni, compilare per Windows è facile quanto copiare uno dei workflow di esempio che abbiamo.
Automatizzare le build di release per Windows
Oltre a migliorare il supporto per la compilazione delle estensioni PHP, abbiamo anche migliorato il modo in cui il runtime PHP viene compilato e mantenuto su Windows. Ora disponiamo di workflow automatizzati in php/php-windows-builder che compilano PHP sui nuovi tag in php/php-src, eseguono i test, le distribuiscono al server dei download e le rendono disponibili sul sito PHP. Si tratta di un enorme miglioramento rispetto a quello che era un processo manuale con ritardi, in cui le build venivano eseguite manualmente da una sola persona nel team Windows e testate dopo la pubblicazione.
Aggiornamenti delle dipendenze e testing
Nell'ambito dei miglioramenti all'infrastruttura di build di PHP, abbiamo anche creato un workflow di test bench. Ci permette di compilare PHP con build non pubblicate delle dipendenze PHP direttamente dagli artefatti dei workflow GitHub, invece di recuperarle dai server PHP. Questo ci consente di testare gli aggiornamenti delle dipendenze.
Prima che esistesse questa infrastruttura di test bench, alcuni aggiornamenti delle dipendenze venivano ritardati o evitati perché testarli adeguatamente su Windows era troppo lento, troppo manuale o troppo complesso. Con un builder e un test bench dedicati, gli aggiornamenti delle dipendenze possono essere testati più rapidamente su branch e configurazioni di PHP. Questo ci aiuta a muoverci più velocemente sia sul fronte della compatibilità sia su quello della sicurezza.
PHP 8.0 fino a PHP 8.3 usano il toolset di Visual Studio 2019, mentre le versioni più recenti come PHP 8.4 e PHP 8.5 usano il toolset di Visual Studio 2022. PHP 8.6 userà il toolset di Visual Studio 2026. Queste transizioni sembrano semplici, ma in pratica influenzano flag del compilatore, build delle dipendenze, compatibilità delle estensioni, immagini base della CI e decisioni di supporto a lungo termine.
Mantenere tutto questo funzionante significa testare costantemente combinazioni di branch PHP, versioni di Visual Studio e pacchetti di dipendenze. php/php-windows-builder ci offre un modo strutturato per farlo, invece di affidarci a build manuali una tantum.
Il lavoro sulla sicurezza: CVE, aggiornamenti delle dipendenze e fix backportati
Una gran parte del mantenimento di PHP per Windows è lavoro sulla sicurezza.
Spesso questo significa aggiornare le librerie di dipendenze su cui si basano PHP e le sue estensioni quando ricevono fix per CVE o quando nuove funzionalità lo richiedono. Tra queste ci sono librerie come libcurl, OpenSSL, ICU, SQLite, libxml2, libjpeg e oltre 40 altre.
Quando una di queste librerie corregge una vulnerabilità, lo stack di dipendenze Windows deve essere rivisto, ricompilato e testato. Il lavoro non è semplice come incrementare un numero di versione.
Una nuova release di una dipendenza può cambiare il comportamento dell'ABI, rimuovere API, richiedere la ricompilazione di un'altra dipendenza, esporre nuovi avvisi del compilatore o rompere un'estensione che prima si compilava senza problemi.
Ad esempio, aggiornare OpenSSL richiede di ricompilare curl e altre librerie che dipendono da essa. Aggiornare ICU può introdurre avvisi MSVC o modifiche a livello di header che influenzano l'estensione intl. Aggiornare Apache deve essere valutato con attenzione perché il modulo Apache di PHP deve rimanere compatibile con il più ampio ecosistema Windows, inclusi gli utenti che eseguono installer di terze parti privi di maintainer, ma che hanno comunque una vasta base di utenti.
C'è anche il lavoro di backporting. A volte il percorso più sicuro per un branch PHP supportato non è far avanzare l'intero stack di dipendenze, ma applicare o adattare patch di sicurezza mirate. Questo significa rivedere i fix upstream, verificare se si applicano correttamente alla versione usata da PHP per Windows, ricompilare la libreria interessata e validare che la build corretta rimanga compatibile con PHP e le sue estensioni.
Questo equilibrio è importante. Vogliamo che gli utenti ricevano rapidamente i fix di sicurezza, ma dobbiamo anche evitare di introdurre regressioni nelle release PHP supportate. La manutenzione della sicurezza su Windows è quindi un processo attento di monitoraggio delle CVE, revisione delle modifiche upstream, ricompilazione delle dipendenze, backport dei fix dove appropriato e validazione del risultato tramite le suite di test di PHP e build reali delle estensioni.
Questa è una delle parti meno visibili del lavoro, ma anche una delle più importanti. Un runtime PHP sicuro dipende non solo dal codice sorgente di PHP, ma anche dalle librerie native che vengono distribuite con esso.
Nell'ambito di questo processo, abbiamo aggiornato queste dipendenze affrontando una serie di problemi di sicurezza segnalati per esse nell'ultimo anno.
| Dipendenza | Versione precedente | Versione aggiornata | Problemi di sicurezza risolti |
|---|---|---|---|
| Apache | 2.4.43 | 2.4.68 | CVE-2026-49975, CVE-2026-48913, CVE-2026-44631, CVE-2026-44186, CVE-2026-44185, CVE-2026-44119, CVE-2026-43951, CVE-2026-42536, CVE-2026-42535, CVE-2026-34356, CVE-2026-34355, CVE-2026-29170, CVE-2026-29167, CVE-2026-23918, CVE-2026-24072, CVE-2026-28780, CVE-2026-29168, CVE-2026-29169, CVE-2026-33006, CVE-2026-33007, CVE-2026-33523, CVE-2026-33857, CVE-2026-34032, CVE-2026-34059, CVE-2025-49630, CVE-2025-55753, CVE-2025-58098, CVE-2025-59775, CVE-2025-65082, CVE-2025-66200, CVE-2025-54090, CVE-2024-42516, CVE-2024-43204, CVE-2024-43394, CVE-2024-47252, CVE-2025-23048, CVE-2025-49812 |
| Firebird client | 3.0.6 | 3.0.14 | CVE-2025-54989 |
| FreeType | 2.11.1 | 2.14.3 | CVE-2022-27404, CVE-2022-27405, CVE-2022-27406, CVE-2025-27363 |
| libavif | 0.9.0 | 1.4.2 | CVE-2025-48174, CVE-2025-48175, CVE-2023-6350, CVE-2023-6351, CVE-2023-6704 |
| libcurl | 8.17.0 | 8.20.0 | CVE-2025-15224, CVE-2025-15079, CVE-2025-14819, CVE-2026-1965, CVE-2026-3783, CVE-2026-3784, CVE-2026-3805, CVE-2026-4873, CVE-2026-5545, CVE-2026-5773, CVE-2026-6253, CVE-2026-6276, CVE-2026-6429, CVE-2026-7009, CVE-2026-7168 |
| liblzma / XZ | 5.8.2 | 5.8.3 | CVE-2026-34743 |
| libpng | 1.6.34 | 1.6.56 | CVE-2026-33416, CVE-2026-33636 |
| PostgreSQL client | 14.18/16.9 | 14.22/16.13 | CVE-2025-8713, CVE-2025-8714, CVE-2025-8715, CVE-2025-12817, CVE-2025-12818, CVE-2026-2003, CVE-2026-2004, CVE-2026-2005, CVE-2026-2006 |
| Cyrus SASL | 2.1.27 | 2.1.28 | CVE-2022-24407 |
| libsodium | 1.0.18 | 1.0.22 | CVE-2025-69277 |
| libssh2 | 1.11.1 | 1.11.1 | Patch per CVE-2026-7598 backportata |
| libxml2 | 2.10.4 | 2.10.4 | Sono state backportate le patch per le seguenti CVE - CVE-2026-0989, CVE-2026-0990, CVE-2026-0992, CVE-2026-1757, CVE-2025-7425 |
| libxslt | 1.1.37 | 1.1.43 | CVE-2024-55549, CVE-2025-24855, CVE-2025-11731, CVE-2025-7424, CVE-2025-10911 |
| nghttp2 | 1.64.0 | 1.69.0 | CVE-2026-27135 |
| OpenSSL | 3.0.18 | 3.0.21/3.5.7 | CVE-2026-45447, CVE-2026-34182, CVE-2026-34183, CVE-2026-42764, CVE-2026-45445, CVE-2026-7383, CVE-2026-9076, CVE-2026-34180, CVE-2026-34181, CVE-2026-42766, CVE-2026-42767, CVE-2026-42768, CVE-2026-42769, CVE-2026-42770, CVE-2026-45446, CVE-2026-31790, CVE-2026-28387, CVE-2026-28388, CVE-2026-35188, CVE-2026-42765, CVE-2026-42771, CVE-2026-28386, CVE-2026-28389, CVE-2026-28390, CVE-2026-31789 |
| SQLite | 3.39.2 | 3.53.2 | CVE-2025-7709, CVE-2025-70873, CVE-2025-7458. |
| zlib | 1.2.12 | 1.3.2 | CVE-2022-37434 |
Abbiamo anche aggiornato queste dipendenze a release più recenti per correzioni di bug e nuove funzionalità.
| Dipendenza | Versione precedente | Versione aggiornata |
|---|---|---|
| GLib | 2.53.3 | 2.88.1 |
| libwebp | 1.3.2 | 1.6.0 |
| libjpeg-turbo | 2.1.0 | 3.1.4 |
| LMDB | 0.9.22 | 0.9.35 |
| libiconv | 1.17 | 1.19 |
| libintl | 0.18.3 | 1.0 |
| libffi | 3.3-4 | 3.5.2 |
| Oniguruma | 6.9.8 | 6.9.10 |
| libenchant2 | 2.2.8 | 2.8.16 |
| OpenLDAP | 2.4.47 | 2.6.13 |
La CI è diventata essenziale
Il lavoro moderno su PHP per Windows dipende fortemente dalla CI.
Non basta compilare PHP una volta in locale e rilasciarlo. Serve un testing ripetibile su branch, architetture, versioni delle dipendenze e combinazioni di runtime.
Nell'ambito di php/php-windows-builder, ora abbiamo un approccio basato su GitHub Actions per compilare PHP e le sue estensioni; si tratta di un miglioramento rispetto ai primi giorni in cui queste venivano compilate sulla macchina Windows fornita da Microsoft.
Prepararsi al futuro
Il supporto a Windows deve anche guardare avanti.
Un'area importante è il supporto alle architetture. Storicamente, PHP per Windows ha distribuito build x86 e x64. Ma il valore del supporto a x86 continua a diminuire, dato che i sistemi Windows moderni sono in stragrande maggioranza a 64 bit, mentre l'interesse per ARM64 è in crescita.
Questo crea un'importante domanda a lungo termine: come dovrebbe apparire in futuro la matrice ufficiale delle build Windows di PHP?
Abbandonare x86 e investire in ARM64 potrebbe avere più senso per le versioni future. Ma questo tipo di decisione non può essere presa alla leggera. Richiede di capire chi dipende ancora da x86, quale compatibilità viene effettivamente preservata e quali nuovi utenti trarrebbero beneficio dalle build ARM64.
Parte del lavoro consiste nel rendere possibili queste transizioni prima che diventino urgenti.
In conclusione
La manutenzione dell'open source è invisibile per design. Se tutto va bene, gli utenti non notano che una dipendenza è stata ricompilata, che un problema del compilatore è stato risolto, che un'estensione è stata corretta o che un workflow CI è stato migliorato. Scaricano semplicemente PHP e continuano a lavorare.
Questo è l'obiettivo.
Ma è anche il motivo per cui vale la pena parlare ogni tanto di questo lavoro. L'affidabilità di un progetto come PHP dipende da molti livelli di manutenzione che avvengono lontano dai riflettori.
Il lato Windows di PHP ha il proprio insieme di sfide, e continuare a investire in esso aiuta a mantenere PHP accessibile a più sviluppatori, più ambienti e più casi d'uso.
Altri articoli recenti
Laravel AI 1.1 e 1.2: Agent Skills, Cohere e structured output più solidi
Le release 1.1.0 e 1.2.0 di laravel/ai portano gli Agent Skills, l'approvazione obbligatoria per i tool built-in e nuovi provider come Cohere e Laya self-hosted. Sul fronte qualità arrivano i fix allo structured output per Bedrock e il supporto alle provider options. Aggiornati anche i modelli di default, con Claude 4.7+ che ignora i sampling params.
Laravel 13.35.0: scheduler più controllabile, code più flessibili e response Markdown
Laravel 13.35.0 porta Schedule::alwaysOnOneServer(), il supporto a schedule:interrupt per i comandi di lunga durata, --memory in percentuale per queue:work e il nuovo metodo markdown() sulla response factory. Tante piccole migliorie anche a test, view compilate in parallelo e dischi local.
BashBox: un interprete Bash in sandbox per agenti AI in PHP
BashBox è un interprete bash scritto in puro PHP che permette di eseguire gli script generati dagli agenti AI senza mai ricorrere a proc_open, exec o shell_exec. Ogni comando è una classe PHP che lavora su un filesystem virtuale, con limiti di esecuzione, quote disco e accesso di rete configurabili. Ideale per chi sviluppa agenti con il Laravel AI SDK o altre librerie simili.