The most dangerous phrase in the language is "We've always done it this way."
— Grace Hopper

Il processo RFC di TrueAsync

TrueAsync porta avanti la possibilità di modificare il core di PHP attraverso il processo RFC.

RFC principale
Nuovo RFCDraft

Async Scheduler Hook API

Autore: Edmond [HT]v0.1PHP 8.x

Un meccanismo per attivare l'esecuzione concorrente a livello del core di PHP. Il core espone hook dedicati che permettono di spostare l'implementazione dello scheduler in un'estensione separata, o persino in codice PHP.

Principi chiave
  • Opt-in rigoroso: nessun overhead finché non viene registrato uno scheduler
  • Compatibile con Fiber: il codice Fiber esistente continua a funzionare, e le fiber vengono prese in carico dallo scheduler
  • Continuation: un cambio di contesto simmetrico A→B costruito sopra la macchineria di Fiber
  • Un unico punto di registrazione: SchedulerHook::register() attiva la concorrenza nell'intero engine
  • Isolamento del contesto per coroutine: contesti utente e interno separati
  • Libertà dell'ecosistema: il core standardizza solo l'attivazione e l'interfaccia dello scheduler, mentre spawn() / await() / i canali restano a carico dell'implementazione
Leggi l'RFC su GitHub
Motivazione

Perché PHP ha bisogno di asincronia integrata

PHP è uno degli ultimi linguaggi importanti a mancare ancora del supporto integrato all'esecuzione concorrente a livello di linguaggio. Python ha asyncio, JavaScript è costruito su un ciclo di eventi, Go ha le goroutine, Kotlin ha le coroutine. PHP rimane nel paradigma «una richiesta, un processo», anche se la maggior parte delle applicazioni reali passa gran parte del tempo in attesa di I/O.

Il problema della frammentazione

Oggi l'asincronia in PHP vive nelle estensioni: Swoole, AMPHP, ReactPHP, ciascuna con il proprio ecosistema e API incompatibili.

  • Ogni estensione riscrive i propri driver MySQL / PostgreSQL / Redis
  • Una libreria per Swoole non funziona con AMPHP, e viceversa
  • Non è possibile rendere non bloccanti le funzioni del core (file_get_contents, curl_exec)
  • Un'alta barriera d'ingresso: un intero ecosistema separato da imparare

La soluzione: un hook nell'engine

TrueAsync aggiunge una giuntura standard per la concorrenza a livello dell'engine di PHP.

  • Trasparenza: il codice sincrono viene eseguito nelle coroutine senza modifiche
  • Nessuna funzione colorata: nessuna marcatura async/await
  • Uno standard unificato: un'unica interfaccia dello scheduler nell'engine per ogni estensione
  • Retrocompatibilità: il codice esistente continua a funzionare

Un'applicazione PHP tipica (Laravel, Symfony, WordPress) passa il 70–90% del suo tempo in attesa di I/O. Con le coroutine questo tempo di inattività viene sfruttato in modo efficiente:

Scenario
Senza coroutine
Con coroutine
3 query al DB da 20 ms ciascuna
60 ms
~22 ms
HTTP + DB + file
sequenziale
parallelo
10 chiamate API
10 × latenza
~1 × latenza
Scenari pratici
Server web · FrankenPHP, RoadRunnerAPI Gateway · aggregazione parallelaAttività in background · code concorrentiTempo reale · WebSockets, streaming
Storia

RFC precedenti

Questi due RFC descrivevano un modello di concorrenza completo integrato direttamente nel core. Il nuovo approccio si basa sulle loro idee, ma sposta fuori dal core l'API rivolta all'utente, mantenendo nell'engine solo il punto di aggancio dello scheduler.

RFC #1Draft

PHP True Async

Autore: Edmond [HT]v1.7PHP 8.6+

L'RFC che definisce un modello di concorrenza per PHP. Descrive le coroutine, le funzioni spawn() / await() / suspend(), l'oggetto Coroutine, le interfacce Awaitable e Completable, la cancellazione cooperativa, l'integrazione con Fiber, la gestione degli errori e il graceful shutdown.

Principi chiave
  • Modifiche minime al codice esistente per abilitare la concorrenza
  • Le coroutine mantengono l'illusione di un'esecuzione sequenziale
  • Cambio automatico delle coroutine sulle operazioni di I/O
  • Cancellazione cooperativa, «cancellable by design»
  • API C standard per le estensioni
Leggi l'RFC su wiki.php.net
RFC #2Draft

Scope e concorrenza strutturata

Autore: Edmond [HT]v1.0

Un'estensione dell'RFC True Async. Introduce la classe Scope, che lega la durata di vita delle coroutine all'ambito lessicale. Descrive la gerarchia degli scope, la propagazione degli errori, la politica delle coroutine «zombie» e le sezioni critiche tramite protect().

Cosa risolve
  • Prevenire la fuga delle coroutine oltre lo scope
  • Pulizia automatica delle risorse all'uscita dallo scope
  • Cancellazione gerarchica: cancellare il genitore cancella tutti i figli
  • Protezione delle sezioni critiche dalla cancellazione
  • Rilevamento di deadlock e self-await
Leggi l'RFC su wiki.php.net

Come sono collegati questi RFC

Il primo RFC definisce le primitive di basso livello: coroutine, funzioni di base e API C per le estensioni. Il secondo RFC aggiunge la concorrenza strutturata: meccanismi per gestire gruppi di coroutine che rendono il codice concorrente sicuro e prevedibile.

RFC #1: True Async
RFC #2: Scope
Livello
Primitive
Gestione
Fornisce
spawn(), await(), Coroutine
Scope, TaskGroup, protect()
Analogie
Go goroutines, Kotlin coroutines
Kotlin CoroutineScope, Python TaskGroup
Obiettivo
Eseguire codice concorrente
Gestione sicura del ciclo di vita

Partecipa alla discussione

Gli RFC vengono discussi sulla mailing list internals@lists.php.net e su GitHub Discussions. Unisciti anche alla conversazione su Discord.