如标题,TcpConnection中,baseRead里面获取当前数据包长度之后,这里有一个判断: $this->_currentPackageLength > strlen($this->_recvBuffer),什么时候才会出现这种情况的呢?一般情况下不是strlen($this->_recvBuffer) >= $this->_currentPackageLength的吗? 还有$_isPaused在这里面起到作用?什么时候才会执行暂停读取的呢?
$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 翻+墙服务器都用了类似的流控机制。
明白了,谢谢walkor
不客气
接受的数据字节数不够当前数据包长度,当客户端发的数据包比较大时会经常出现先收到部分数据的情况。
$_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 翻+墙服务器都用了类似的流控机制。
明白了,谢谢walkor
不客气