Dirija las solicitudes al controlador Laravel al servidor WebSocket en ejecución

La situación:

Hay una tarea de larga duración que debe iniciarse de forma asincrónica. Los detalles de esta tarea no son realmente tan importantes (lo básico es que se aprovisionarán varias máquinas virtuales y una configuración de red compleja), y esto está siendo manejado por un script de Python que se ejecutará en un servidor diferente. Decidimos ir con WebSockets para la comunicación entre el servidor web y el cliente, y tengo la comunicación bidireccional allí trabajando. El servidor web enviará solicitudes al otro servidor y recibirá notificaciones HTTP POST desde el script de Python cuando cada máquina esté en funcionamiento, y un HTTP POST final cuando toda la red esté activa.

Todo esto funciona. El marco que estamos usando en el servidor web es Laravel 4, y el servidor de socket web fue construido usandoTrinquetee implementado en un comando artesanal. Mi problema es que no estoy seguro de cómo retransmitir las POST HTTP a un controlador Laravel desde la secuencia de comandos de Python al servidor WebSocket para que a su vez pueda transmitir esa información al cliente.

A continuación se muestra la implementación de Ratchet'sMessageComponentInterface::onMessage , que utiliza un patrón de Observador para notificar a los oyentes suscritos de un evento de mensaje.

// Class: SocketMessenger
public function onMessage(ConnectionInterface $from, $msg) {
    $respondTo = null;
    foreach($this->_clients as $client) {
        if($client->resourceId == $from->resourceId) {
            $respondTo = $client;
            break;
        }
    }

    $msg = json_decode($msg, true);

    if(!$respondTo || !$msg || !isset($msg['type'])) {
        echo 'Malformed Socket Message Received, Rejecting.';
        return;
    }

    $type = $msg['type'];

    // Notify any subscribed listeners with this message type of the 
    // incoming message. Any response received will be relayed back to 
    // the client.
    if(isset($this->_listeners[$type])) {
        foreach( $this->_listeners[$type] as $listener ) {
            $response = $listener->notify( $respondTo, $msg );
            if($response) {
                $respondTo->send( $response );
            }
        }
    }
}

El servidor WebSocket está construido dentro de un proveedor de servicios como este:

// Class: SocketServiceProvider
$app->bind( 'Ratchet\MessageComponentInterface', function( $app, $params ) {
    $port = $params && isset($params[0]) ?
        $params[0] : self::DEFAULT_PORT
    ;

    $messenger = new SocketMessenger;

    // Setup the Ratchet Server.
    $server = IoServer::factory(
        new HttpServer(
            new WsServer(
                 $messenger
            )
        ),
        $port
    );

    // Subscribe socket listeners to the socket messenger
    $messenger->subscribe( new TopologyMessageListener, TopologyMessageListener::TYPE );

    return $server;
} );

¿Hay alguna forma de llevar solicitudes a un controlador Laravel y notificar al servidor WebSocket en ejecución cada vez que se golpea el método de un controlador dado?

Respuestas a la pregunta(1)

Su respuesta a la pregunta