通过ratchetphp向客户端发送数据时如何管理缓冲数据

时间:2019-04-30 07:46:48

标签: php websocket ratchet reactphp

我通过ratchetphpreactphp库在php中实现了一个websocket服务器。

我想将数据发送到10MB的客户端,并且不能再减少了。但是问题是应该先缓冲数据,直到客户端没有完全接收到数据,缓冲才会消失。每个客户端下载大约10MB的数据可能需要2-3分钟,每2秒钟就会有新数据添加到cleint的缓冲区中。因此,缓冲区的大小变得太大,脚本需要更多的RAM来执行操作,然后崩溃。

我想知道在每次向客户端发送信息之前如何检查缓冲区,以了解它是否完全接收到数据。我还想检查缓冲区当前是否空闲,因此,如果缓冲区不处于空闲状态,则不会向其发送新的数据包。

即使我可以完全禁用缓冲区并立即将数据发送给客户端,也是最好的。

这是我的代码:

global $port,$clients;
$port = 9000;
$clients = [];


class arzWebSocketClients implements Ratchet\MessageComponentInterface {

    public function __construct() {

    }

    public function onOpen(Ratchet\ConnectionInterface $conn) {

        $clients[$conn->resourceId] = $conn;

    }

    public function onMessage(Ratchet\ConnectionInterface $from, $msg) {

    }

    public function onClose(Ratchet\ConnectionInterface $conn) {
        global $clients;
        unset($clients[$conn->resourceId]);

    }

    public function onError(Ratchet\ConnectionInterface $conn, \Exception $e) {
        global $clients;
        unset($clients[$conn->resourceId]);

        $conn->close();

    }

}

//-----------------------------------------------------------------

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

$loop->addPeriodicTimer(2, function ($timer) use ($loop) {


    global $clients;

    $jsonedData = json_encode($data); //----- about 10 MegaBytes

    foreach ($clients as $a){


        $a->send($jsonedData);


    }

});
//-----------------------------------------------------------------
$app = new Ratchet\App('localhost', $port,'0.0.0.0',$loop);
$app->route('/', new arzWebSocketClients);
$app->run();

0 个答案:

没有答案