Ecco cosa ho imparato come sviluppatore PHP sincrono sull'async PHP
Ho lavorato con Laravel per anni. Usavo PHP sincrono. Arriva una richiesta, viene eseguito un processo e viene inviata una risposta. Non ho mai avuto bisogno dell'async.
Poi ho letto della nuova Polling API di PHP 8.6. Ha cambiato la mia visione di come PHP gestisce i task.
Ecco una spiegazione di come funziona l'async.
Il problema dell'I/O bloccante
Quando chiami un'API, il tuo codice attende.
Esempio: $response = Http::get('https://api.example.com');
Se quell'API impiega 300ms, il tuo processo PHP non fa nulla per 300ms. Rimane in uno stato di sospensione. Occupa memoria e occupa uno slot di un worker. Se tutti i tuoi worker sono in attesa, il tuo server smette di accettare nuove richieste.
La soluzione async
L'async ti permette di svolgere altri lavori durante quei 300ms. Invece di aspettare, esegui altri task.
Ma come fai a sapere quando arrivano i dati? È qui che entra in gioco il kernel.
L'evoluzione del polling
select() PHP dispone di
stream_select()fin dalla versione 4. Chiede al kernel: "Ci sono dati pronti su questi socket?". Il problema è il costo del riscan. Se hai 10.000 connessioni, devi inviare l'intera lista al kernel ogni volta. Questo è lento e raggiunge i limiti di sistema.epoll / kqueue Questa è una funzionalità del kernel, non del linguaggio. Linux usa epoll. macOS usa kqueue. Invece di scansionare un'intera lista, il kernel mantiene una "ready-list". Ti dice solo quali socket specifici hanno dei dati. Questo scala fino a migliaia di connessioni senza costi aggiuntivi.
Fibers (PHP 8.1) Le Fiber ti permettono di mettere in pausa una funzione in qualsiasi punto dello stack di chiamata. Una Fiber non si risveglia da sola. È come un video di YouTube in pausa. Qualcuno deve chiamare
$fiber->resume()per farlo ripartire.
L'anello mancante: PHP 8.6
L'I/O async richiede tre parti: • Pausa: Fibers (ora nel core di PHP) • Decisione: L'Event Loop (codice PHP semplice) • Conoscenza: Kernel Polling (la lacuna)
Fino ad ora, a PHP mancava un modo nativo per "sapere" quale socket è pronto senza usare vecchi strumenti o estensioni in C.
PHP 8.6 colma questa lacuna. Porta una Polling API nativa nel core. Utilizzerà automaticamente epoll su Linux e kqueue su Mac.
Visione d'insieme
L'async non è magia. Un event loop è solo codice PHP che decide quando chiamare resume() su una Fiber.
Le Fiber forniscono la capacità di mettere in pausa. epoll fornisce l'intelligenza per sapere quando riprendere.
Se usi solo PHP sincrono, non devi cambiare le tue app Laravel oggi stesso. Ma comprendere questo modello rende molto più facile padroneggiare librerie async come ReactPHP o Amp.
Costruisci, non limitarti a consumare. Esegui il codice tu stesso per vedere come funziona.
