2015-06-10 21 views
5

tôi phải làm một số tính toán phức tạp giữa gửi tin nhắn, nhưng thông điệp đầu tiên được gửi đi với thứ hai sau compulting. Làm thế nào tôi có thể gửi nó ngay lập tức?Ratchet WebSocket - gửi tin nhắn ngay lập tức

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

Bắt đầu từ server:

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

Bạn có thể sử dụng EventLoop chạy mỗi mili giây và hàng đợi thư của riêng bạn để gửi. – MarshallOfSound

+0

Đó là ý tưởng hay, nhưng tôi nghĩ đó không phải là giải pháp tối ưu (nhiều lần lặp lại, không làm gì cả). Thật không may tôi không biết cách nào tốt hơn. – Redkrytos

+0

Vâng, đó là một loại gợi ý cuối cùng của loại điều. Ngắn của overiding một số phần cốt lõi của Ratchet. Tôi cho rằng bạn có thể sử dụng bản giao hưởng để khởi chạy một quy trình mới để thực hiện các công cụ tính toán? – MarshallOfSound

Trả lời

1

send cuối cùng làm cho đường tới của Phản ứng EventLoop đó sẽ gửi các thông điệp không đồng bộ khi đó là "sẵn sàng". Trong thời gian có nghĩa là nó từ bỏ việc thực hiện và sau đó các kịch bản thực hiện phép tính của bạn. Vào thời điểm đó, bộ đệm sẽ gửi tin nhắn đầu tiên và thứ hai của bạn. Để tránh điều này, bạn có thể yêu cầu tính toán để thực hiện trên EventLoop dưới dạng đánh dấu sau khi các bộ đệm hiện tại được rút ra:

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(); 
Các vấn đề liên quan