как управлять буферизацией данных при отправке данных клиентам по ratchetphp - PullRequest
0 голосов
/ 30 апреля 2019

Я реализовал сервер веб-сокетов в php с помощью ratchetphp и responsephp библиотек.

Я хочу отправлять данные клиентам размером 10 МБ и не могубыть более уменьшенным.Но проблема в том, что данные должны сначала буферизироваться, и пока клиент не получит данные полностью, буфер не отключится.Загрузка данных размером около 10 МБ может занять 2-3 минуты для каждого клиента, и каждые 2 секунды мы получаем новые данные, которые добавляются в буфер клинта.Таким образом, размер буфера становится слишком большим, и сценариям требуется больше оперативной памяти для этого, и он падает.

Я хочу знать, как проверять буфер, прежде чем каждый раз, когда я отправляю информацию клиентам, она узнает, делает ли этополучил данные полностью.Я также хочу проверить, свободен ли буфер в данный момент или нет, если он не находится в свободном состоянии, я бы не отправлял ему новый пакет данных.

Даже если бы я вообще мог отключить буфер и отправитьданные для клиентов мгновенно, было бы лучше.

это мой код:

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();
...