WebSocket Chat: integrando en el blog (live)


14 de marzo de 2026

Este post se actualiza en tiempo real conforme avanzamos. Hassan, aqui tienes el progreso.

Ultima actualizacion: 14 marzo 2026, 13:00

Estado: COMPLETADO

El chat WebSocket esta integrado en el blog. Un solo proceso PHP sirve el blog HTTP y el chat WebSocket en el mismo event loop de ReactPHP.

Puedes probarlo ahora mismo: abre el blog en dos pestanas y escribe en el chat (esquina inferior derecha).

Que hemos hecho

1. Fusionar WS en el proceso principal

El WebSocket ya no es un proceso separado. Ratchet comparte el event loop con ReactPHP HTTP:

ANTES:                              DESPUES:

 cohete.service (:80)                cohete.service (:80 + :8001)
   └─ ReactPHP HTTP                   ├─ ReactPHP HTTP
                                       └─ Ratchet WS
 cohete-ws.service (:8001)
   └─ Ratchet WS                    Un solo proceso. Un solo loop.

La clave: IoServer de Ratchet acepta un LoopInterface externo en su constructor. No necesita crear su propio loop. Le pasamos el de ReactPHP y listo.

En bootstrap.php, despues de iniciar el HTTP server:

ReactHttpServer::init($host, $port, $loop, $isDevelopment);

// WebSocket en el mismo loop
WebSocketServer::init($host, 8001, $loop);

$loop->run();  // Un solo run() para todo

2. Codigo en su sitio

Movido de scripts/Drafts/websocketServer/ a ubicacion DDD:

src/ddd/Infrastructure/WebSocket/
  ├── WebSocketServer.php   → static init() como ReactHttpServer
  ├── Chat.php              → MessageComponentInterface (broadcast)
  └── ConnectionPool.php    → SplObjectStorage + UUID por conexion

WebSocketServer::init() sigue el mismo patron que ReactHttpServer::init(): metodo estatico, recibe host/port/loop, crea la cadena Ratchet (Chat → WsServer → HttpServer → IoServer) y la engancha al loop compartido.

3. Chat incrustado en el blog

Tres lineas de HTML en BlogIndexController.php y BlogAuthorPostController.php:

<script src="rxjs-cdn"></script>
<script type="module" src="/js/atomic/organism/ChatBox.js"></script>
<chat-box group="cohete-blog"></chat-box>

El <chat-box> es un Web Component con Shadow DOM. Detecta automaticamente si esta en produccion (HTTPS → wss://ws.pascualmg.dev) o en local (HTTP → ws://localhost:8001).

4. Deploy limpio

Al arrancar, el log dice:

server listening on tcp://0.0.0.0:80
WebSocket server listening on tcp://0.0.0.0:8001

Un PID. Un proceso. Dos protocolos.

La tabla de progreso

Paso Estado
WS server en produccion HECHO
Frontend ChatBox dark theme HECHO
ws.pascualmg.dev via Cloudflare tunnel HECHO
Mover de Drafts/ a Infrastructure/WebSocket/ HECHO
Fusionar en mismo event loop (bootstrap.php) HECHO
Incrustar <chat-box> en /blog HECHO
Deploy integrado a vespino HECHO
Desactivar cohete-ws.service HECHO

Siguiente: cohete-skeleton

Todo esto acabara en cohete-skeleton como demo de lo que el framework puede hacer out-of-the-box. La idea: composer create-project cohete/skeleton y tienes HTTP async + WebSocket + Web Components + DDD. Pero eso es FASE 2.

Lo inmediato que queda:

Hassan, si quieres trastear con el codigo: github.com/pascualmg/cohete, rama main, directorio src/ddd/Infrastructure/WebSocket/.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario