Biblioteca WebSocket Ratchet para PHP: creación de aplicaciones en tiempo real
WebSocket es un protocolo que proporciona comunicación bidireccional entre el cliente y el servidor a través de una única conexión persistente. A diferencia del HTTP tradicional, donde cada solicitud abre una nueva conexión, WebSocket permite transferir datos en tiempo real sin demoras. Para PHP, una de las bibliotecas más populares para trabajar con WebSocket es Ratchet. Esta biblioteca está construida sobre ReactPHP y proporciona una API simple y potente para crear servidores WebSocket.
¿Qué es Ratchet?
Ratchet es una biblioteca PHP de código abierto que permite a los desarrolladores crear aplicaciones en tiempo real, como chats, notificaciones, juegos en línea y sistemas de monitoreo. Abstrae la complejidad de trabajar con sockets y entrada/salida asíncrona, proporcionando clases e interfaces convenientes.
Características principales de Ratchet:
- Soporte para WebSocket según la especificación RFC 6455
- Integración con servidores HTTP (por ejemplo, a través de ReactPHP)
- Posibilidad de crear manejadores de mensajes personalizados
- Soporte para WAMP (WebSocket Application Messaging Protocol) para Pub/Sub
- Ligereza y alto rendimiento
Instalación de Ratchet
La instalación de la biblioteca se realiza a través de Composer. Ejecute en la terminal:
composer require cboden/ratchetDespués de la instalación, en su proyecto aparecerá la carpeta vendor con las dependencias necesarias, incluyendo ReactPHP.
Creación de un servidor WebSocket simple
Consideremos un ejemplo básico: crearemos un servidor que acepte conexiones y envíe un mensaje de bienvenida. Para ello, cree el archivo 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 MyWebSocket implements MessageComponentInterface { protected $clients;
public function __construct() { $this->clients = new \\SplObjectStorage; }
public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "Nueva conexión: {$conn->resourceId}"; $conn->send("¡Bienvenido! Su ID: {$conn->resourceId}"); }
public function onMessage(ConnectionInterface $from, $msg) { echo "Mensaje recibido de {$from->resourceId}: {$msg}"; // Enviar a todos los clientes foreach ($this->clients as $client) { if ($from !== $client) { $client->send("Mensaje de {$from->resourceId}: {$msg}"); } } }
public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Conexión {$conn->resourceId} cerrada"; }
public function onError(ConnectionInterface $conn, \\Exception $e) { echo "Error: {$e->getMessage()}"; $conn->close(); }}
$server = IoServer::factory( new HttpServer( new WsServer( new MyWebSocket() ) ), 8080);
echo "Servidor WebSocket iniciado en el puerto 8080...";$server->run();Inicie el servidor con el comando:
php server.phpAhora el servidor escucha en el puerto 8080. Para probarlo, puede usar cualquier cliente WebSocket, por ejemplo, una extensión del navegador o un código JavaScript simple.
Parte del cliente en JavaScript
Cree un archivo HTML client.html:
<!DOCTYPE html><html><head> <title>Cliente WebSocket</title></head><body> <input type="text" id="message" placeholder="Ing