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
- Handshake HTTP: O cliente envia uma requisição HTTP especial com o cabeçalho
Upgrade: websocket. O servidor verifica a chaveSec-WebSocket-Keye retorna uma resposta com status 101 Switching Protocols. - 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.
- 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/ratchetPasso 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