Introdução à programação assíncrona em PHP
Tradicionalmente, o PHP é considerado uma linguagem síncrona: cada requisição é executada sequencialmente, bloqueando a execução até que a operação seja concluída (por exemplo, uma consulta ao banco de dados ou API). No entanto, com o aumento das demandas de desempenho das aplicações web, a programação assíncrona em PHP está se tornando cada vez mais necessária. O código assíncrono permite executar várias tarefas simultaneamente, sem esperar a conclusão de cada uma, o que acelera significativamente o processamento de requisições e reduz a carga no servidor.
Neste guia, abordaremos os conceitos principais da programação assíncrona em PHP, exploraremos bibliotecas populares (ReactPHP, Amp), bem como recursos modernos da linguagem — Fiber e generators.
Fundamentos da assincronicidade: Event Loop e I/O não bloqueante
Na base de qualquer abordagem assíncrona está o Event Loop (ciclo de eventos). Trata-se de um loop infinito que verifica se algum evento ocorreu (por exemplo, a conclusão de uma requisição HTTP ou leitura de arquivo). Se um evento ocorreu, o manipulador correspondente é executado. Enquanto isso, o fluxo principal não é bloqueado — ele pode alternar para outra tarefa.
I/O não bloqueante (Non-blocking I/O) é o princípio chave. No código síncrono, a chamada file_get_contents() bloqueia a execução do script até que o arquivo seja totalmente carregado. No modo assíncrono, você inicia a operação e continua executando outro código, e o resultado chega através de um callback ou Promise.
Exemplo: requisição síncrona vs assíncrona
// Código síncrono (bloqueante)
$start = microtime(true);
$data1 = file_get_contents('http://example.com/api1');
$data2 = file_get_contents('http://example.com/api2');
echo "Tempo de execução: " . (microtime(true) - $start) . " seg"; // ~2 seg (se cada requisição levar 1 seg)
// Código assíncrono (ReactPHP)
$loop = React\\EventLoop\\Factory::create();
$client = new React\\Http\\Browser($loop);
$promise1 = $client->get('http://example.com/api1');
$promise2 = $client->get('http://example.com/api2');
$promise1->then(function ($response) {
echo "Resposta 1 recebida";
});
$promise2->then(function ($response) {
echo "Resposta 2 recebida";
});
$loop->run();
// Tempo de execução ~1 seg (requisições executadas em paralelo)
Bibliotecas para programação assíncrona em PHP
Atualmente, as duas bibliotecas mais populares são ReactPHP e Amp. Ambas fornecem Event Loop, Promise, além de componentes prontos para trabalhar com HTTP, sockets e sistema de arquivos.
ReactPHP
ReactPHP é uma biblioteca madura que existe desde 2012. Ela fornece acesso de baixo nível ao ciclo de eventos e diversos componentes: react/socket, react/http, react/dns e outros.
// Exemplo de servidor HTTP com ReactPHP
$loop = React\\EventLoop\\Factory::create();
$server = new React\\Http\\Server($loop, function (Psr\\Http\\Message\\ServerRequestInterface $request) {
return new React\\Http\\Message\\Response(
200,
['Content-Type' => 'text/plain'],
"Hello, Async World!"
);
});
$socket = new React\\Socket\\Server('127.0.0.1:8080', $loop);
$server->listen($socket);
echo "Servidor rodando em http://127.0.0.1:8080";
$loop->run();
Amp
Amp utiliza corrotinas (generator-based coroutines) e oferece uma API de mais alto nível. Em vez de cadeias de then(), você usa yield e await, tornando o código semelhante ao síncrono.
// Exemplo com Amp
\\Amp\\Loop::run(function () {
$response = yield \\Amp\\Http\\Client\\HttpClient::request('http://example.com');
$body = yield $response->getBody()->buffer();
echo $body;
});
Fiber: assincronicidade no núcleo do PHP 8.1
A partir do PHP 8.1, foram adicionados à linguagem os
Blogs
Book Recommendations
Leia também
Concatenando string e int em C++: guia completo para iniciantes
Programação Funcional em TypeScript: Fundamentos e Prática
Programação Assíncrona em PHP: Guia Completo com Exemplos
Feature flags em C++: gerenciamento de funcionalidades sem dor e sem recompilação
Como corrigir o erro "Headers already sent" no PHP: guia passo a passo