Arquitetura Event-driven em PHP: código assíncrono sem dor

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

Quando seu código PHP deixa de ser apenas um script

\n\n

Você já executou um script PHP que processava mil e-mails e esperou um minuto até ele terminar? Ou tentou criar um chat com PHP puro e percebeu que, sem recarregar a página constantemente, era impossível? Se sim, você já enfrentou as limitações da abordagem síncrona tradicional.

\n\n

Arquitetura event-driven em PHP não é apenas um termo da moda vindo do mundo Node.js. É uma forma real de tornar seu código mais rápido, responsivo e escalável. Neste artigo, vamos explorar como a programação orientada a eventos funciona no PHP, criar exemplos práticos e entender quando ela é realmente necessária.

\n\n

O que é arquitetura Event-driven em termos simples

\n\n

Imagine um escritório onde cada funcionário segue estritamente as instruções: "Faça A, depois B, depois C". Isso é código síncrono. Agora imagine um escritório onde os funcionários reagem a eventos: "Quando um e-mail chegar, responda a ele", "Quando um pedido for concluído, envie uma notificação". Isso é arquitetura orientada a eventos.

\n\n

Na arquitetura event-driven em PHP, o programa não é executado linearmente. Em vez disso, ele aguarda eventos (clique, requisição, temporizador, conclusão de tarefa) e reage a eles. O componente principal aqui é o event loop (loop de eventos), que verifica constantemente se algo aconteceu e executa os manipuladores correspondentes.

\n\n

Por que desenvolvedores PHP devem prestar atenção nisso

\n\n

Por muito tempo, o PHP foi associado exclusivamente à execução síncrona: a requisição chega, o script é executado, a resposta é enviada. Mas com o surgimento de bibliotecas como ReactPHP e Amp, tudo mudou. Agora você pode:

\n\n
    \n
  • Processar milhares de conexões WebSocket simultaneamente
  • \n
  • Executar tarefas em segundo plano sem filas como RabbitMQ
  • \n
  • Construir microsserviços reais em PHP puro
  • \n
  • Escrever clientes e servidores HTTP assíncronos
  • \n
\n\n

E tudo isso — sem mudar de linguagem ou reescrever toda a base de código.

\n\n

Componentes principais da arquitetura Event-driven

\n\n

Antes de escrever código, vamos entender os conceitos-chave. Em qualquer sistema orientado a eventos em PHP, existem três elementos principais:

\n\n
    \n
  • Event loop — um loop infinito que escuta eventos (temporizadores, sockets, sinais) e os despacha para os manipuladores.
  • \n
  • Emitter/Dispatcher — o objeto que gera e envia eventos.
  • \n
  • Listener/Handler — a função ou método que reage a um evento específico.
  • \n
\n\n

No PHP clássico, você escreveria: file_get_contents('https://api.example.com') — e esperaria pela resposta. Na abordagem event-driven, você se inscreve no evento "dados recebidos" e continua executando outro código.

\n\n

Exemplo 1: Um Event Dispatcher simples em PHP puro

\n\n

Vamos implementar um despachante de eventos básico sem bibliotecas externas. Isso ajudará a entender a essência da programação orientada a eventos em PHP.

\n\n
<?php\n\nclass EventDispatcher {\n    private array $listeners = [];\n\n    public function addListener(string $eventName, callable $listener): void {\n        $this->listeners[$eventName][] = $listener;\n    }\n\n    public function dispatch(string $eventName, mixed $data = null): void {\n        if (!isset($this->listeners[$eventName])) {\n            return;\n        }\n        foreach ($this->listeners[$eventName] as $listener) {\n            call_user_func($listener, $data);\n        }\n    }\n}\n\n// Uso\n$dispatcher = new EventDispatcher();\n\n$dispatcher->addListener('user.registered', function ($userData) {\n    echo "Enviando e-mail de boas-vindas para {$userData['email']}\\n";\n});\n\n$dispatcher->addListener('user.registered', function ($userData) {\n    echo "Registrando log de usuário {$userDa                

Blogs

Book Recommendations