Biblioteca WebSocket Ratchet para PHP: criando tempo real no site

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 para que serve a biblioteca Ratchet para PHP?

WebSocket é um protocolo que fornece uma conexão bidirecional permanente entre o cliente (navegador) e o servidor. Diferentemente do HTTP clássico, onde as requisições são iniciadas apenas pelo cliente, o WebSocket permite que o servidor envie dados instantaneamente, sem esperar por uma requisição. Esta é a solução ideal para chats, notificações em tempo real, jogos online, rastreadores e qualquer aplicação onde a baixa latência é importante.

O PHP padrão não possui suporte nativo a WebSocket, mas a biblioteca Ratchet (que utiliza o componente ReactPHP) preenche essa lacuna. Ratchet é uma biblioteca assíncrona que permite executar um servidor WebSocket diretamente do PHP, processando múltiplas conexões simultaneamente sem bloqueio.



Principais recursos do Ratchet

  • Assincronicidade — baseada no ReactPHP, não bloqueia o fluxo ao aguardar dados.
  • Suporte a protocolos — WebSocket (RFC 6455), além de componentes HTTP (para aplicações híbridas).
  • Simplicidade — código mínimo para iniciar o servidor.
  • Escalabilidade — pode ser combinado com ZeroMQ ou Redis para funcionar em cluster.
  • Compatibilidade — funciona com qualquer navegador moderno através do objeto WebSocket nativo.


Instalação do Ratchet

A instalação é feita via Composer. Abra o terminal na raiz do projeto e execute:

composer require cboden/ratchet

Após a instalação, todas as dependências, incluindo ReactPHP, estarão na pasta vendor.



Criando um servidor WebSocket simples com Ratchet

Vamos criar o arquivo server.php:

<?phprequire 'vendor/autoload.php';

use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;

class Chat implements MessageComponentInterface { protected $clients;

public function __construct() { $this->clients = new \\SplObjectStorage; }

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

public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } }

public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Desconexão: {$conn->resourceId}"; }

public function onError(ConnectionInterface $conn, \\Exception $e) { echo "Erro: {$e->getMessage()}"; $conn->close(); }}

$server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080);

echo "Servidor iniciado na porta 8080";$server->run();


Explicação do código

  • Chat — classe que implementa MessageComponentInterface. Em onOpen salvamos a conexão, em onMessage — enviamos a mensagem para todos, exceto o remetente.
  • IoServer::factory — cria o servidor baseado no ReactPHP. Envolvemos nosso componente em WsServer (para WebSocket) e HttpServer (para compatibilidade com requisições HTTP).
  • O servidor escuta na porta 8080. Inicie-o com o comando: php server.php.


Parte do cliente (JavaScript)

Crie o arquivo HTML client.html:

<!DOCTYPE html><html><head>    <title>Chat WebSocket</title>    <script>        const ws = new WebSocket('ws://localhost:8080');

Recommendations