Integración de WebSockets con PHP para Comunicación Bidireccional Asíncrona
PHP, tradicionalmente conocido por su arquitectura orientada a la petición/respuesta, puede extenderse para manejar comunicación en tiempo real mediante WebSockets. Si bien PHP no es ideal para mantener conexiones persistentes a largo plazo debido a sus limitaciones intrínsecas de ejecución, podemos usar bibliotecas y arquitecturas específicas para delegar la gestión de las conexiones WebSocket a un servidor dedicado (normalmente Node.js, Go o Ratchet) y usar PHP para procesar la lógica de negocio subyacente.
Este post explora cómo integrar PHP con un servidor WebSocket externo (asumiendo un servidor Ratchet en PHP para simplificar el ejemplo) para permitir la comunicación bidireccional asíncrona. En lugar de gestionar directamente las conexiones WebSocket en PHP, lo usaremos para enviar y recibir mensajes a través de una cola de mensajes (Message Queue), como RabbitMQ.
// Archivo: websocket_message_publisher.php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Configuración de RabbitMQ
$host = 'localhost';
$port = 5672;
$user = 'guest';
$password = 'guest';
$exchange = 'websocket_exchange';
$routing_key = 'websocket.message';
// Conexión a RabbitMQ
$connection = new AMQPStreamConnection($host, $port, $user, $password);
$channel = $connection->channel();
// Declaración del exchange (si no existe)
$channel->exchange_declare($exchange, 'direct', false, false, false);
// Función para publicar un mensaje en RabbitMQ
function publish_websocket_message(string $message_data) {
global $channel, $exchange, $routing_key;
$msg = new AMQPMessage($message_data);
$channel->basic_publish($msg, $exchange, $routing_key);
echo " [x] Sent " . $message_data . "\n";
}
// Ejemplo de uso: Enviar un mensaje
$data = ['user_id' => 123, 'message' => 'Hola desde PHP!'];
$message_json = json_encode($data);
publish_websocket_message($message_json);
// Cerrar la conexión
$channel->close();
$connection->close();
El código anterior muestra cómo un script PHP puede publicar mensajes en una cola de mensajes RabbitMQ. El servidor WebSocket (por ejemplo, un servidor Ratchet corriendo en otro proceso) se suscribirá a esta cola, recibirá los mensajes, y los enviará a los clientes WebSocket conectados correspondientes.
// Código simplificado del servidor Ratchet (ejemplo ilustrativo)
// (Este código corre independientemente del script anterior)
// Asume que ya tiene una cola de mensajes RabbitMQ configurada y un servidor Ratchet WebSocket.
// Procesa los mensajes de la cola y los envía a los clientes WebSocket conectados.
// (Este código es solo una *ilustración* de cómo interactúa con la cola, no es código Ratchet completo)
//...
//Recibe un mensaje de RabbitMQ.
//Decodifica el JSON y extrae el "user_id".
//Itera sobre las conexiones WebSocket buscando la conexión cuyo usuario_id coincida.
//Envía el mensaje al cliente WebSocket.
//...
Esta arquitectura permite a PHP encargarse de la lógica de la aplicación sin tener que lidiar directamente con la complejidad de las conexiones WebSocket. El servidor WebSocket, corriendo en un entorno más adecuado para la gestión de conexiones persistentes, gestiona la comunicación en tiempo real, mientras que PHP puede interactuar a través de una cola de mensajes.
No hay comentarios:
Publicar un comentario