Concorrência em PHP: threads, goroutines e async/await com exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que desenvolvedores PHP precisam pensar em concorrência?

\n\n

Houve um tempo em que se acreditava que o PHP era uma linguagem para "scripts rápidos", onde tudo era executado sequencialmente, sem necessidade de trabalho paralelo sério. Os tempos mudaram. Hoje, construímos com PHP APIs de alta carga, filas de tarefas, web sockets e até microsserviços. E surge a pergunta: como fazer o PHP executar várias tarefas simultaneamente sem bloquear tudo?

\n\n

Neste artigo, vamos explorar três abordagens para concorrência em PHP: threads clássicas (pthreads), goroutines leves (Fiber) e a sintaxe moderna async/await. Você verá exemplos reais de código, descobrirá qual ferramenta usar em cada situação e o que escolher em 2025.

\n\n

Se você busca execução paralela em PHP para processar dados ou quer entender como as goroutines em PHP diferem das threads, está no lugar certo.

\n\n

1. Multithreading em PHP: pthreads — antigo, mas poderoso

\n\n

O que é e como funciona?

\n

pthreads é uma extensão que permite ao PHP criar threads reais do sistema operacional. Cada thread é uma instância separada do Zend Engine com sua própria memória, mas com capacidade de trocar dados através de objetos Threaded.

\n\n

Detalhe importante: o pthreads funciona apenas no modo CLI e não é suportado em ambientes web (Apache/Nginx mod_php). Porém, é a única maneira de obter paralelismo real (não apenas concorrência) a nível de CPU.

\n\n

Exemplo: parsing paralelo de URLs

\n
<?php\n// Certifique-se de que a extensão pthreads está instalada\nclass UrlFetcher extends Thread {\n    private $url;\n    private $result;\n\n    public function __construct(string $url) {\n        $this->url = $url;\n    }\n\n    public function run() {\n        // Executado em uma thread separada\n        $this->result = file_get_contents($this->url);\n    }\n\n    public function getResult() {\n        return $this->result;\n    }\n}\n\n$urls = ['https://api.exemplo.com/1', 'https://api.exemplo.com/2', 'https://api.exemplo.com/3'];\n$threads = [];\n\nforeach ($urls as $url) {\n    $thread = new UrlFetcher($url);\n    $thread->start(); // Inicia a thread\n    $threads[] = $thread;\n}\n\n// Coleta os resultados\nforeach ($threads as $thread) {\n    $thread->join(); // Aguarda a conclusão\n    echo $thread->getResult() . PHP_EOL;\n}\n?>
\n\n

O código inicia três threads, cada uma baixando sua própria URL. O tempo de execução é aproximadamente igual ao da requisição mais lenta, não a soma das três. Uma excelente ilustração de execução paralela em PHP.

\n\n

Quando usar pthreads?

\n
    \n
  • Tarefas pesadas de CPU (processamento de imagens, criptografia, renderização de PDF).
  • \n
  • Parsing de grandes volumes de dados em scripts CLI.
  • \n
  • Quando você precisa de paralelismo real, não apenas multitarefa cooperativa.
  • \n
\n\n

2. Goroutines em PHP: Fiber — leveza e controle

\n\n

O que é Fiber?

\n

A partir do PHP 8.1, a linguagem ganhou os Fiber — análogos às goroutines do Go ou corrotinas do Python. Diferente das threads, o Fiber não cria um processo separado do SO. É uma unidade de execução leve que opera em uma única thread e alterna sob comando do desenvolvedor.

\n\n

A ideia central: você decide quando pausar o Fiber atual e passar o controle para outro. Isso é chamado de multitarefa cooperativa. Ideal para operações de I/O (requisições a APIs, leitura de arquivos, trabalho com banco de dados).

\n\n

Exemplo: varredura assíncrona de diretórios

\n
<?php\nfunction readFileAsync(string $path): Fiber {\n    return new Fiber(function () use ($path) {\n        $handle = fopen($path, 'r');\n        $content = '';\n        while (!feof($handle)) {\n            $chunk = fread($handle, 4096);\n            $content .= $chunk;\n            // Pausa o Fiber para dar chance a outros\n                

Blogs

Book Recommendations