2015-06-10 12 views
5

Devo eseguire alcuni complicati calcoli tra l'invio di messaggi, ma il primo messaggio viene inviato con il secondo dopo il completamento. Come posso inviarlo immediatamente?Ratchet WebSocket - invia un messaggio immediatamente

<?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; 
    } 
} 

server di partenza:

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

Si potrebbe usare un EventLoop che viene eseguito ogni millisecondo, e la vostra coda di messaggi da inviare. – MarshallOfSound

+0

È una buona idea, ma penso che non sia la soluzione ottimale (molte iterazioni, che non fanno nulla). Purtroppo non conosco un modo migliore. – Redkrytos

+0

Sì, era una specie di suggerimento di ultima istanza. A parte l'esagerazione di alcune delle parti principali di Ratchet. Suppongo che potresti usare symphony per avviare un nuovo processo per fare le cose del computer? – MarshallOfSound

risposta

1

send finalmente si fa strada di Reagire EventLoop che invia il messaggio in modo asincrono quando è "pronto". Nel frattempo rinuncia all'esecuzione e quindi gli script eseguono il calcolo. Al termine, il buffer invierà quindi il primo e il secondo messaggio. Per evitare questo si può dire il calcolo da eseguire sul EventLoop come un segno di spunta dopo i buffer attuali non siano scariche:

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(); 
Problemi correlati