国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

TcpConnection中,baseRead讀取數(shù)據(jù)原理問題

24tergderg

如標(biāo)題,TcpConnection中,baseRead里面獲取當(dāng)前數(shù)據(jù)包長度之后,這里有一個判斷:
$this->_currentPackageLength > strlen($this->_recvBuffer),什么時候才會出現(xiàn)這種情況的呢?一般情況下不是strlen($this->_recvBuffer) >= $this->_currentPackageLength的嗎?
還有$_isPaused在這里面起到作用?什么時候才會執(zhí)行暫停讀取的呢?

4000 3 0
3個回答

walkor 打賞

$this->_currentPackageLength > strlen($this->_recvBuffer),什么時候才會出現(xiàn)這種情況的呢?

接受的數(shù)據(jù)字節(jié)數(shù)不夠當(dāng)前數(shù)據(jù)包長度,當(dāng)客戶端發(fā)的數(shù)據(jù)包比較大時會經(jīng)常出現(xiàn)先收到部分?jǐn)?shù)據(jù)的情況。

還有$_isPaused在這里面起到作用?什么時候才會執(zhí)行暫停讀取的呢?

$_isPaused為true(即調(diào)用了$connection->pauseRecv()),也就是停止讀取對端數(shù)據(jù),此功能用于限制流量。

比如workerman開發(fā)代理服務(wù)看視頻,國內(nèi)客戶端C<----國外代理服務(wù)P<-----國外實際視頻服務(wù)器S。
視頻流從S到P再到C的過程中,S到P的網(wǎng)速很快,C到P之間的網(wǎng)速很慢,這樣會導(dǎo)致大量數(shù)據(jù)積壓在P,
最終可能導(dǎo)致P內(nèi)存爆掉。
有了暫停讀取機(jī)制,那么當(dāng)P到C的發(fā)送緩沖區(qū)滿時(onBufferFull事件),在P上通過調(diào)用$connection->pauseRecv()停止讀取S發(fā)來的視頻數(shù)據(jù),就能保護(hù)P服務(wù)器。當(dāng)P到C的緩沖區(qū)的數(shù)據(jù)發(fā)送完畢時(onBufferDrain事件),P再調(diào)用$connection->resumeRecv()繼續(xù)讀取S的數(shù)據(jù)。

流量控制在workerman開發(fā)的代理服務(wù)器中使用的比較多。
例如workerman開發(fā)的https://github.com/walkor/php-http-proxy、https://github.com/walkor/php-socks5、以及workerman開發(fā)的ss-php 翻+墻服務(wù)器都用了類似的流控機(jī)制。

  • 暫無評論
24tergderg

明白了,謝謝walkor

  • 暫無評論
walkor 打賞

不客氣

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??