我通过ratchetphp和reactphp库在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();