WebSockets em PHP: como fazer o site falar em tempo real
\n\nImagine um site comum. Você clica em um botão — e espera a página atualizar. É como enviar uma carta pelo correio: você a coloca na caixa e torce para que chegue. Agora imagine que você está falando ao telefone — ouve o interlocutor imediatamente. WebSockets são exatamente esse "telefone" para a web. E sim, em PHP funciona.
\n\nMuitos acham que WebSocket é coisa de Node.js ou Python. Mas o PHP, embora tenha sido criado para "colar" HTML, há muito superou seu berço. Hoje vamos entender como fazer uma aplicação em tempo real com PHP — seja um chat, um feed de notificações ou análise ao vivo. E sem gambiarras.
\n\nSe você já tentou fazer um chat ao vivo em PHP usando long polling e viu o servidor cair com 1000 requisições por segundo — este artigo é para você. WebSockets mudam as regras do jogo.
\n\nO que é WebSocket e por que o PHP se dá bem com ele?
\n\nWebSocket é um canal de comunicação bidirecional entre o navegador e o servidor. Diferente do HTTP, onde o cliente sempre inicia a requisição, aqui o servidor pode enviar dados diretamente ao cliente. Isso proporciona tempo real verdadeiro, não uma simulação.
\n\nA principal diferença do long polling (quando o cliente pergunta constantemente "e aí, tem novidades?") é que no WebSocket a conexão permanece aberta. Estabelece uma vez — e se comunica sem interrupções. A economia de tráfego e recursos é colossal.
\n\nO PHP, como linguagem, executa scripts sequencialmente. Mas isso não o impede de ser um excelente servidor para WebSocket. O segredo está na arquitetura: não executamos o PHP através de um servidor web (Apache/Nginx) para cada conexão, mas o usamos como um daemon independente. E é aí que entram as bibliotecas.
\n\nBibliotecas para WebSocket em PHP: qual escolher?
\n\nAs duas bibliotecas mais populares merecem atenção:
\n\n- \n
- Ratchet — o avô dos WebSockets em PHP. Confiável, testado, mas um pouco "antiquado". Usa modelo de eventos baseado em
ReactPHP. Ótimo para chats simples e notificações. \n - Swoole — um monstro. Não é apenas uma biblioteca, mas um motor completo que reescreve o núcleo do PHP. Oferece assincronicidade, corrotinas e desempenho próximo ao Go. Mas requer instalação de extensão no servidor. \n
Para um primeiro contato, recomendo o Ratchet — é mais fácil de aprender e não exige alterações no php.ini. Além disso, funciona perfeitamente com ReactPHP, que também abordaremos hoje.
\n\nCriando um servidor WebSocket simples em PHP com Ratchet
\n\nVamos criar um servidor echo básico. Ele receberá mensagens do cliente e as enviará de volta. É o clássico "Hello, World" para WebSocket.
\n\nPrimeiro, instale o Ratchet via Composer. Abra o terminal na raiz do projeto:
\n\ncomposer require cboden/ratchet\n\nAgora crie o arquivo server.php:
<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nclass EchoServer implements MessageComponentInterface {\n public function onOpen(ConnectionInterface $conn) {\n echo "Nova conexão: {$conn->resourceId}\\n";\n }\n\n public function onMessage(ConnectionInterface $from, $msg) {\n echo "Recebido: {$msg}\\n";\n $from->send("Eco: {$msg}");\n }\n\n public function onClose(ConnectionInterface $conn) {\n echo "Conexão {$conn->resourceId} fechada\\n";\n }\n\n public function onError(ConnectionInterface $conn, \\Exception $e) {\n echo "Erro: {$e->getMessage()}\\n";\n $conn->close();\n }\n}\n\n// Iniciando o servidor\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\n\