WebSocket Chat: integrando en el blog (live)
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
cohete-ws.serviceeliminado del sistema (nixos-rebuild switch)cohete.servicearranca con ambos servers: HTTP :80 + WS :8001- Cloudflare tunnel sigue enrutando
ws.pascualmg.devalocalhost:8001
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:
- Drag and drop del widget de chat
- Salas/canales (ahora todo va a un broadcast global)
- Persistencia de mensajes
- Notificaciones de nuevos mensajes
Hassan, si quieres trastear con el codigo: github.com/pascualmg/cohete,
rama main, directorio src/ddd/Infrastructure/WebSocket/.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario