2015-06-10 6 views
5

Ich muss einige komplizierte Berechnungen zwischen dem Senden von Nachrichten, aber die erste Nachricht wird mit Sekunden nach dem Kompilieren gesendet. Wie kann ich es sofort versenden?Ratsche WebSocket - Nachricht sofort senden

<?php 

namespace AppBundle\WSServer; 

use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface; 

class CommandManager implements MessageComponentInterface { 

    public function onOpen(ConnectionInterface $conn) { 
     //... 
    } 

    public function onClose(ConnectionInterface $connection) { 
     //... 
    } 

    public function onMessage(ConnectionInterface $connection, $msg) { 
     //... 
     $connection->send('{"command":"someString","data":"data"}'); 

     //...complicated compulting 
     sleep(10); 

     //send result 
     $connection->send('{"command":"someString","data":"data"}'); 
     return; 
    } 
} 

Start Server:

$server = IoServer::factory(
       new HttpServer(
        new WsServer(
         $ws_manager 
       ) 
      ), $port 
); 
+0

Sie könnten eine Ereignisschleife verwenden, die jede Millisekunde ausgeführt wird, und Ihre eigene Warteschlange von Nachrichten zu senden. – MarshallOfSound

+0

Es ist eine nette Idee, aber ich denke, es ist keine optimale Lösung (viele Iterationen, die nichts tun). Leider kenne ich keinen besseren Weg. – Redkrytos

+0

Ja, es war irgendwie ein letzter Ausweg Vorschlag Art der Sache. Kurz, einige der Kernteile von Ratchet zu übersteuern. Ich nehme an, du könntest mit Symphony einen neuen Prozess starten, um die Computer-Sachen zu machen? – MarshallOfSound

Antwort

1

send macht schließlich seinen Weg der Ereignisschleife zu reagieren, die die Nachricht sendet asynchron, wenn es „bereit“. In der Zwischenzeit gibt es die Ausführung auf und dann führt das Skript die Berechnung aus. Wenn das erledigt ist, sendet der Puffer Ihre erste und zweite Nachricht. Um dies zu vermeiden können Sie die Berechnung sagen auf der Ereignisschleife als Zecke ausgeführt werden, nachdem die aktuellen Puffer leer sind:

class CommandMessage implements \Ratchet\MessageComponentInterface { 
    private $loop; 
    public function __construct(\React\EventLoop\LoopInterface $loop) { 
     $this->loop = $loop; 
    } 

    public function onMessage(\Ratchet\ConnectionInterface $conn, $msg) { 
     $conn->send('{"command":"someString","data":"data"}'); 

     $this->loop->nextTick(function() use ($conn) { 
      sleep(10); 

      $conn->send('{"command":"someString","data":"data"}'); 
     }); 
    } 
} 

$loop = \React\EventLoop\Factory::create(); 

$socket = new \React\Socket\Server($loop); 
$socket->listen($port, '0.0.0.0'); 

$server = new \Ratchet\IoServer(
    new HttpServer(
     new WsServer(
      new CommandManager($loop) 
     ) 
    ), 
    $socket, 
    $loop 
); 

$server->run();