2015-06-10 9 views
5

मुझे संदेश भेजने के बीच कुछ जटिल कंप्यूटिंग करना है, लेकिन पहले संदेश को कंप्यूटिंग के बाद दूसरे के साथ भेजा जाता है। मैं इसे तुरंत कैसे भेज सकता हूं?रैचेट वेबसॉकेट - तुरंत संदेश भेजें

<?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 = IoServer::factory(
       new HttpServer(
        new WsServer(
         $ws_manager 
       ) 
      ), $port 
); 
+0

आप एक EventLoop है कि हर मिलीसेकंड चलाता है, और संदेशों के अपने खुद के कतार इस्तेमाल कर सकते हैं भेजने के लिए। – MarshallOfSound

+0

यह अच्छा विचार है, लेकिन मुझे लगता है कि यह इष्टतम समाधान नहीं है (बहुत सारे पुनरावृत्तियों, जो कुछ भी नहीं करते हैं)। दुर्भाग्य से मुझे कोई बेहतर तरीका नहीं पता है। – Redkrytos

+0

हाँ, यह एक अंतिम उपाय सुझाव प्रकार की तरह था। रत्शेट के कुछ प्रमुख हिस्सों को पार करने के लिए छोटा। मुझे लगता है कि आप कंप्यूटिंग सामान करने के लिए एक नई प्रक्रिया शुरू करने के लिए सिम्फनी का उपयोग कर सकते हैं? – MarshallOfSound

उत्तर

1

send अंततः की प्रतिक्रिया करने की EventLoop जो संदेश भेजता है एसिंक्रोनस रूप से जब यह "तैयार" है अपनी राह बनाता है। इस बीच में यह निष्पादन को छोड़ देता है और फिर स्क्रिप्ट आपकी गणना निष्पादित करती है। जब तक बफर किया जाता है तब तक आपका पहला और दूसरा संदेश भेज देगा। इससे बचने के लिए आप एक टिक के रूप में EventLoop पर अमल करने के लिए के बाद वर्तमान बफ़र्स सूखा कर रहे हैं गणना बता सकते हैं:

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(); 
संबंधित मुद्दे