Quando seu código PHP deixa de ser apenas um script
\n\nVocê 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\nArquitetura 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\nO que é arquitetura Event-driven em termos simples
\n\nImagine 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\nNa 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\nPor que desenvolvedores PHP devem prestar atenção nisso
\n\nPor 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
E tudo isso — sem mudar de linguagem ou reescrever toda a base de código.
\n\nComponentes principais da arquitetura Event-driven
\n\nAntes 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
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.
Exemplo 1: Um Event Dispatcher simples em PHP puro
\n\nVamos 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