Biblioteca Ratchet para WebSocket en PHP
En el desarrollo web moderno, cada vez se requiere más el intercambio de datos en tiempo real: chats, notificaciones, juegos en línea, edición colaborativa de documentos. El HTTP tradicional no es adecuado para estas tareas, ya que funciona bajo el esquema de «solicitud-respuesta». Aquí es donde entra en juego el protocolo WebSocket, que establece una conexión bidireccional permanente entre el cliente y el servidor.
Para PHP, una de las bibliotecas más populares y maduras para trabajar con WebSocket es Ratchet. Proporciona una API conveniente para crear servidores WebSocket que pueden manejar múltiples conexiones simultáneas. En este artículo, analizaremos en detalle cómo instalar Ratchet, escribir un servidor y cliente simples, y veremos casos de uso típicos.
¿Qué es Ratchet?
Ratchet es una biblioteca para PHP, construida sobre ReactPHP (un bucle de eventos asíncrono). Permite crear servidores WebSocket que funcionan en tiempo real, sin necesidad de módulos adicionales (como ext-sockets o ext-event). La biblioteca es compatible con el estándar RFC 6455 (WebSocket) y se integra fácilmente con cualquier aplicación PHP.
Características principales de Ratchet:
- Soporte para el protocolo WebSocket (versiones 13 e inferiores).
- Posibilidad de crear controladores personalizados para manejar mensajes.
- Soporte integrado para WAMP (WebSocket Application Messaging Protocol) para pub/sub (publicador-suscriptor) y RPC (llamada a procedimiento remoto).
- Fácil integración con frameworks (Laravel, Symfony) a través de paquetes separados.
- Alto rendimiento gracias a la arquitectura asíncrona de ReactPHP.
Instalación de Ratchet
La instalación se realiza a través de Composer. Para ello, en la raíz de tu proyecto ejecuta el comando:
composer require cboden/ratchetDespués de la instalación, en tu proyecto aparecerá el directorio vendor con la biblioteca y sus dependencias (incluyendo ReactPHP). Asegúrate de tener instalado PHP versión 7.1 o superior.
Creación de un servidor WebSocket simple
Escribamos un servidor simple que reciba mensajes de los clientes y los envíe de vuelta (servidor eco). Crea un archivo server.php:
<?phprequire __DIR__ . '/vendor/autoload.php';
use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;
class EchoServer implements MessageComponentInterface { public function onOpen(ConnectionInterface $conn) { echo "Nueva conexión: {$conn->resourceId}"; }
public function onMessage(ConnectionInterface $from, $msg) { echo "Mensaje recibido de {$from->resourceId}: {$msg}"; // Enviamos el mensaje de vuelta al remitente $from->send("Eco: {$msg}"); }
public function onClose(ConnectionInterface $conn) { echo "Conexión {$conn->resourceId} cerrada"; }
public function onError(ConnectionInterface $conn, \\Exception $e) { echo "Error: {$e->getMessage()}"; $conn->close(); }}
// Iniciamos el servidor en el puerto 8080$server = IoServer::factory( new HttpServer( new WsServer( new EchoServer() ) ), 8080);
echo "Servidor WebSocket iniciado en el puerto 8080";$server->run();Ejecuta el servidor con el comando php server.php. Escuchará las conexiones WebSocket entrantes en el puerto 8080.
Creación de un cliente (JavaScript)
Para probarlo, crea un archivo HTML simple con un cliente JavaScript:
<!DOCTYPE html><html><head> <title>Cliente WebSocket</title></head><bod