TcpConnection中,baseRead读取数据原理问题

24tergderg

如标题,TcpConnection中,baseRead里面获取当前数据包长度之后,这里有一个判断:
$this->_currentPackageLength > strlen($this->_recvBuffer),什么时候才会出现这种情况的呢?一般情况下不是strlen($this->_recvBuffer) >= $this->_currentPackageLength的吗?
还有$_isPaused在这里面起到作用?什么时候才会执行暂停读取的呢?

3223 3 0
3个回答

walkor

$this->_currentPackageLength > strlen($this->_recvBuffer),什么时候才会出现这种情况的呢?

接受的数据字节数不够当前数据包长度,当客户端发的数据包比较大时会经常出现先收到部分数据的情况。

还有$_isPaused在这里面起到作用?什么时候才会执行暂停读取的呢?

$_isPaused为true(即调用了$connection->pauseRecv()),也就是停止读取对端数据,此功能用于限制流量。

比如workerman开发代理服务看视频,国内客户端C<----国外代理服务P<-----国外实际视频服务器S。
视频流从S到P再到C的过程中,S到P的网速很快,C到P之间的网速很慢,这样会导致大量数据积压在P,
最终可能导致P内存爆掉。
有了暂停读取机制,那么当P到C的发送缓冲区满时(onBufferFull事件),在P上通过调用$connection->pauseRecv()停止读取S发来的视频数据,就能保护P服务器。当P到C的缓冲区的数据发送完毕时(onBufferDrain事件),P再调用$connection->resumeRecv()继续读取S的数据。

流量控制在workerman开发的代理服务器中使用的比较多。
例如workerman开发的https://github.com/walkor/php-http-proxy、https://github.com/walkor/php-socks5、以及workerman开发的ss-php 翻+墙服务器都用了类似的流控机制。

  • 暂无评论
24tergderg

明白了,谢谢walkor

  • 暂无评论
walkor

不客气

  • 暂无评论
年代过于久远,无法发表回答
🔝