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/ratchetApó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 implementaMessageComponentInterface. EmonOpensalvamos a conexão, emonMessage— enviamos a mensagem para todos, exceto o remetente.IoServer::factory— cria o servidor baseado no ReactPHP. Envolvemos nosso componente emWsServer(para WebSocket) eHttpServer(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');
Também na biblioteca
Configuração de aplicações Go (Golang): bibliotecas e ferramentas
Trabalhando com S3 e armazenamentos em nuvem em Kotlin: AWS SDK e Ktor S3 Client
Envio de SMS em Rust: RustSMS — Biblioteca de API para trabalhar com gateways SMS
Trabalhando com Markdown em TypeScript: bibliotecas, parsers e ferramentas
Geração de relatórios PDF em PHP: visão geral de bibliotecas e ferramentas