WebSocket em PHP: aplicações em tempo real do A ao Z

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

O que é WebSocket e por que é necessário em PHP



O protocolo HTTP tradicional funciona no esquema "requisição-resposta": o cliente envia uma requisição, o servidor a processa e retorna uma resposta. Para obter novos dados, o cliente precisa recarregar constantemente a página ou usar AJAX-polling (requisições periódicas ao servidor). Essa abordagem cria carga excessiva e não fornece uma comunicação verdadeiramente "ao vivo".



WebSocket (RFC 6455) é um protocolo que estabelece uma conexão bidirecional permanente entre o cliente (navegador) e o servidor. Após o handshake, os dados podem ser transmitidos em ambas as direções em tempo real, sem requisições HTTP repetidas. É a solução ideal para:



  • Chats e mensageiros
  • Feeds de notícias e notificações
  • Edição colaborativa de documentos
  • Jogos e leilões
  • Monitoramento e dashboards


Muitos acreditam que o PHP não é adequado para tarefas em tempo real devido à sua natureza síncrona. No entanto, com o surgimento de bibliotecas como Ratchet e ReactPHP, a situação mudou drasticamente. O PHP pode trabalhar eficientemente com WebSocket, usando arquitetura orientada a eventos e entrada/saída não bloqueante.



Arquitetura de uma aplicação WebSocket em PHP



Antes de escrever código, é importante entender como funciona a conexão WebSocket no lado do servidor PHP.



Etapas do estabelecimento da conexão



  1. Handshake HTTP: O cliente envia uma requisição HTTP especial com o cabeçalho Upgrade: websocket. O servidor verifica a chave Sec-WebSocket-Key e retorna uma resposta com status 101 Switching Protocols.
  2. Troca de protocolo: Após o handshake bem-sucedido, a conexão é alterada para o modo WebSocket. A troca de dados subsequente ocorre por meio de frames binários.
  3. Comunicação duplex: O servidor e o cliente podem enviar mensagens a qualquer momento, até que a conexão seja fechada por uma das partes.


PHP Síncrono vs PHP Assíncrono



Um script PHP comum funciona de forma síncrona: uma requisição — um processo, após a resposta o script é encerrado. Para WebSocket, é necessário um processo em execução contínua, que escuta uma porta e gerencia múltiplas conexões simultâneas. É aqui que o ReactPHP entra em ação — uma biblioteca que implementa um loop de eventos (event loop) para PHP.



A biblioteca Ratchet é construída sobre o ReactPHP e fornece uma interface conveniente para criar servidores WebSocket. Ela lida com o trabalho de baixo nível com sockets, análise de frames e gerenciamento de conexões.



Implementação prática: criando um chat em tempo real



Vamos considerar a criação de um chat simples usando WebSocket com Ratchet. Este exemplo pode ser adaptado para qualquer tarefa em tempo real.



Passo 1: Instalação das dependências



Certifique-se de ter o Composer instalado (gerenciador de dependências para PHP). Instale o Ratchet e suas dependências:



composer require cboden/ratchet


Passo 2: Criando a classe manipuladora



Crie o arquivo ChatServer.php, que gerenciará as conexões e mensagens:



<?phpnamespace MyApp;

use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;

class ChatServer implements MessageComponentInterface{ protected $clients;

public function __construct() { // SplObjectStorage — uma maneira conveniente de armazenar objetos de conexão $this->clients = new \\SplObjectStorage; echo "Servidor iniciado!"; }

public function onOpen(ConnectionInterface $conn) { // Novo cliente conectou $this->clients->attach($conn); echo "Nova conexão: {$conn->resourceId}"; }

public function onMessage(Connectio

Blogs

Book Recommendations