A Verdade Sobre o PHP Assíncrono: Fibers, epoll e PHP 8.6
Trabalhei com Laravel por anos. Eu usava PHP síncrono. Uma requisição chega, o processo é executado e a resposta é enviada. Eu nunca precisei de código assíncrono.
Então, li sobre a nova Polling API do PHP 8.6. Isso mudou a forma como vejo tudo.
Aqui está o que aprendi sobre como o assíncrono funciona por baixo dos panos.
O Problema de I/O
Quando você chama uma API, seu processo PHP espera.
Exemplo:
$response = Http::get('https://api.example.com');
Se essa chamada levar 300ms, sua CPU não faz nada por 300ms. Ela permanece em estado de espera (sleep). Isso é I/O bloqueante.
Se você tiver três chamadas de API:
- API A: 300ms
- API B: 400ms
- API C: 200ms
Total sequencial: 900ms. Total assíncrono: 400ms (o tempo da chamada mais lenta).
O assíncrono permite que seu processo realize outros trabalhos enquanto espera pelos dados.
Select vs. epoll
Para fazer assíncrono, você precisa saber qual socket tem dados prontos.
select() O PHP usa
stream_select()desde a versão 4. Ele funciona solicitando ao kernel que monitore uma lista de sockets. O problema: toda vez que os dados chegam, você deve escanear a lista inteira novamente. Isso é uma "taxa de re-escaneamento" (rescan tax). Também possui um limite de cerca de 1024 conexões.epoll (Linux) / kqueue (macOS) Estes são recursos do kernel. Em vez de escanear uma lista, o kernel mantém uma lista de prontos (ready-list). Ele informa apenas quais sockets específicos estão prontos. Isso escala para milhares de conexões sem trabalho extra.
epoll não é um recurso do PHP. É um recurso do Linux. Go, Rust e Node.js utilizam ele.
Fibers: O Botão de Pausa
O PHP 8.1 introduziu os Fibers. Eu pensei que os Fibers acordariam sozinhos. Eles não acordam.
Um Fiber é como um vídeo pausado. Ele permanece pausado até que alguém chame $fiber->resume().
Um Event Loop é apenas um trecho de código PHP que decide quando chamar o resume().
O I/O assíncrono requer três partes:
- Pausa: Fibers (core do PHP 8.1)
- Decisão: O Event Loop (código PHP puro)
- Conhecimento: Kernel Polling (epoll/kqueue)
Antes do PHP 8.6, o PHP tinha as partes de "Pausa" e "Decisão", mas a parte de "Conhecimento" dependia do antigo select() ou de extensões lentas em C.
O PHP 8.6 fecha essa lacuna. Ele traz uma Polling API nativa para o core. Agora, o PHP pode usar epoll ou kqueue diretamente, sem extensões extras.
Conclusão
Se você usa Laravel com PHP-FPM, não precisa mudar nada hoje.
Mas entenda isto: Assíncrono não é mágica. É apenas uma maneira inteligente de gerenciar o tempo de espera.
Pare de apenas consumir código. Execute um script simples. Quebre-o. É assim que você realmente aprende.
