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.

  1. 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.

  2. 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.

Fonte: https://dev.to/alamriku/sync-php-developer-hisebe-async-php-bujhte-giye-yaa-shikhlaam-fibers-epoll-aar-php-86-462j