Leitet Anforderungen an Laravel Controller an den laufenden WebSocket-Server weiter

Die Situation:

Es gibt eine lang laufende Aufgabe, die asynchron gestartet werden muss. Die Details dieser Aufgabe sind eigentlich nicht so wichtig (die Grundlagen sind, dass mehrere VMs bereitgestellt werden und ein komplexes Netzwerk-Setup), und dies wird von einem Python-Skript erledigt, das auf einem anderen Server ausgeführt wird. Wir haben uns für WebSockets für die Kommunikation zwischen dem Webserver und dem Client entschieden, und dort funktioniert die bidirektionale Kommunikation. Der Webserver sendet Anforderungen an den anderen Server und erhält HTTP-POST-Benachrichtigungen vom Python-Skript zurück, wenn jeder Computer in Betrieb ist, und einen endgültigen HTTP-POST, wenn das gesamte Netzwerk in Betrieb ist.

Das alles funktioniert. Das Framework, das wir auf dem Webserver verwenden, ist Laravel 4, und der Websocket-Server wurde mithilfe von erstelltRatscheund in einem handwerklichen Befehl implementiert. Mein Problem ist, dass ich nicht sicher bin, wie ich die HTTP-POSTs vom Python-Skript an den WebSocket-Server an einen Laravel-Controller weiterleiten soll, damit er diese Informationen wiederum an den Client zurücksenden kann.

Unten ist die Implementierung von RatchetMessageComponentInterface::onMessage Methode, die ein Observer-Muster verwendet, um abonnierte Listener über ein Nachrichtenereignis zu benachrichtigen.

// 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 );
            }
        }
    }
}

Der WebSocket-Server ist in einem Dienstanbieter wie folgt aufgebaut:

// 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;
} );

Gibt es eine Möglichkeit, Anfragen an einen Laravel-Controller zu richten und den laufenden WebSocket-Server zu benachrichtigen, wenn die Methode eines bestimmten Controllers getroffen wird?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage