Я реализовал сервер веб-сокетов в 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();