WebSockets en PHP: Creando aplicaciones en tiempo real sin magia

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

WebSockets en PHP: cómo hacer que tu sitio hable en tiempo real

\n\n

Imagina un sitio web normal. Haces clic en un botón y esperas a que la página se actualice. Es como enviar una carta por correo: la echas al buzón y esperas que llegue. Ahora imagina que hablas por teléfono: escuchas a tu interlocutor al instante. WebSockets es ese "teléfono" para la web. Y sí, funciona con PHP.

\n\n

Muchos creen que WebSocket es cosa de Node.js o Python. Pero PHP, aunque fue creado para "pegar" HTML, hace tiempo que superó su cuna. Hoy veremos cómo crear una aplicación en tiempo real con PHP, ya sea un chat, un feed de notificaciones o analíticas en vivo. Y sin parches.

\n\n

Si alguna vez intentaste hacer un chat en vivo con PHP usando long polling y viste cómo el servidor colapsaba con 1000 peticiones por segundo, este artículo es para ti. WebSockets cambian las reglas del juego.

\n\n

¿Qué es WebSocket y por qué PHP se lleva bien con él?

\n\n

WebSocket es un canal de comunicación bidireccional entre el navegador y el servidor. A diferencia de HTTP, donde el cliente siempre inicia la solicitud, aquí el servidor puede enviar datos al cliente por sí mismo. Esto proporciona tiempo real real, no una simulación.

\n\n

La diferencia clave con long polling (donde el cliente pregunta constantemente "¿hay novedades?") es que en WebSocket la conexión permanece abierta. La estableces una vez y te comunicas sin interrupciones. El ahorro de tráfico y recursos es enorme.

\n\n

PHP, como lenguaje, ejecuta scripts de forma secuencial. Pero eso no le impide ser un excelente servidor para WebSocket. El secreto está en la arquitectura: no ejecutamos PHP a través de un servidor web (Apache/Nginx) para cada conexión, sino que lo usamos como un demonio independiente. Y aquí entran en juego las bibliotecas.

\n\n

Bibliotecas para WebSocket en PHP: ¿cuál elegir?

\n\n

Las dos bibliotecas más populares merecen atención:

\n\n
    \n
  • Ratchet — el abuelo de los WebSocket en PHP. Fiable, probado, pero un poco "anticuado". Usa un modelo basado en eventos con ReactPHP. Ideal para chats simples y notificaciones.
  • \n
  • Swoole — una bestia. No es solo una biblioteca, sino un motor completo que reescribe el núcleo de PHP. Ofrece asincronía, corrutinas y un rendimiento cercano a Go. Pero requiere instalar una extensión en el servidor.
  • \n
\n\n

Para empezar, recomiendo Ratchet — es más fácil de aprender y no requiere modificar php.ini. Además, funciona muy bien junto con ReactPHP, que también veremos hoy.

\n\n

Escribimos un servidor WebSocket simple en PHP con Ratchet

\n\n

Vamos a crear un servidor eco básico. Recibirá mensajes del cliente y los devolverá. Es el clásico "Hola, mundo" para WebSocket.

\n\n

Primero, instalamos Ratchet con Composer. Abre la terminal en la raíz del proyecto:

\n\n
composer require cboden/ratchet
\n\n

Ahora creamos el archivo server.php:

\n\n
<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nclass EchoServer implements MessageComponentInterface {\n    public function onOpen(ConnectionInterface $conn) {\n        echo "Nueva conexión: {$conn->resourceId}\\n";\n    }\n\n    public function onMessage(ConnectionInterface $from, $msg) {\n        echo "Recibido: {$msg}\\n";\n        $from->send("Eco: {$msg}");\n    }\n\n    public function onClose(ConnectionInterface $conn) {\n        echo "Conexión {$conn->resourceId} cerrada\\n";\n    }\n\n    public function onError(ConnectionInterface $conn, \\Exception $e) {\n        echo "Error: {$e->getMessage()}\\n";\n        $conn->close();\n    }\n}\n\n// Iniciamos el servidor\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\n\                

Blogs

Book Recommendations