WebSocket en PHP: aplicaciones en tiempo real de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es WebSocket y por qué es necesario en PHP?



El protocolo HTTP tradicional funciona bajo el esquema de «solicitud-respuesta»: el cliente envía una solicitud, el servidor la procesa y devuelve una respuesta. Para obtener nuevos datos, el cliente tiene que recargar la página constantemente o usar AJAX-polling (solicitudes periódicas al servidor). Este enfoque genera una carga excesiva y no proporciona una comunicación verdaderamente «en vivo».



WebSocket (RFC 6455) es un protocolo que establece una conexión bidireccional permanente entre el cliente (navegador) y el servidor. Después del protocolo de enlace (handshake), los datos pueden transmitirse en ambas direcciones en tiempo real sin necesidad de repetir solicitudes HTTP. Es la solución ideal para:



  • Chats y mensajería instantánea
  • Fuentes de noticias y notificaciones
  • Edición colaborativa de documentos
  • Juegos y subastas
  • Monitoreo y paneles de control


Muchos creen que PHP no es adecuado para tareas en tiempo real debido a su naturaleza síncrona. Sin embargo, con la aparición de bibliotecas como Ratchet y ReactPHP, la situación ha cambiado drásticamente. PHP puede trabajar eficientemente con WebSocket utilizando una arquitectura orientada a eventos y entrada/salida no bloqueante.



Arquitectura de una aplicación WebSocket en PHP



Antes de escribir código, es importante entender cómo funciona una conexión WebSocket en el lado del servidor PHP.



Etapas del establecimiento de la conexión



  1. Protocolo de enlace HTTP (handshake): El cliente envía una solicitud HTTP especial con el encabezado Upgrade: websocket. El servidor verifica la clave Sec-WebSocket-Key y devuelve una respuesta con el estado 101 Switching Protocols.
  2. Cambio de protocolo: Después de un handshake exitoso, la conexión se cambia al modo WebSocket. El intercambio de datos posterior se realiza mediante tramas binarias.
  3. Comunicación dúplex: El servidor y el cliente pueden enviar mensajes en cualquier momento, hasta que una de las partes cierre la conexión.


PHP Síncrono vs PHP Asíncrono



Un script PHP normal funciona de forma síncrona: una solicitud, un proceso; después de la respuesta, el script finaliza. Para WebSocket se requiere un proceso en ejecución constante que escuche un puerto y maneje múltiples conexiones simultáneas. Aquí es donde ReactPHP viene al rescate: una biblioteca que implementa un bucle de eventos (event loop) para PHP.



La biblioteca Ratchet está construida sobre ReactPHP y proporciona una interfaz conveniente para crear servidores WebSocket. Se encarga del trabajo de bajo nivel con sockets, el análisis de tramas y la gestión de conexiones.



Implementación práctica: creando un chat en tiempo real



Veamos la creación de un chat simple con WebSocket usando Ratchet. Este ejemplo se puede adaptar a cualquier tarea en tiempo real.



Paso 1: Instalación de dependencias



Asegúrese de tener instalado Composer (el gestor de dependencias para PHP). Instale Ratchet y sus dependencias:



composer require cboden/ratchet


Paso 2: Creación de la clase manejadora



Creemos el archivo ChatServer.php, que gestionará las conexiones y los mensajes:



<?phpnamespace MyApp;

use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;

class ChatServer implements MessageComponentInterface{ protected $clients;

public function __construct() { // SplObjectStorage — una forma conveniente de almacenar objetos de conexión $this->clients = new \\SplObjectStorage; echo "¡Servidor iniciado!"; }

public function onOpen(ConnectionInterface $conn) { // Nuevo cliente conectado $this->clients->attach($conn); echo "Nueva conexión: {$conn->resourceId}"; }

public function onMessage(Connectio

Blogs

Book Recommendations