客戶端網(wǎng)絡(luò)狀況差的時候,服務(wù)端向客戶端發(fā)消息,會不會存在數(shù)據(jù)丟失的情況?如果有,那怎么解決呢?
這個理論上是涉及內(nèi)核socket緩沖區(qū)的讀寫,結(jié)合workerman的還有個應(yīng)用緩沖區(qū)的讀寫,這里你可以簡單的理解為有一層數(shù)據(jù)緩沖區(qū)即可,我們拿其中的一端比如服務(wù)端來來說【客戶端道理一樣的】理論上當數(shù)據(jù)緩沖區(qū)滿了的時候,意味著對端的客戶端已經(jīng)無法讀取數(shù)據(jù)或者讀取的速度遠慢于服務(wù)端,也就是緩沖區(qū)不可再寫,比如遇上客戶端網(wǎng)絡(luò)狀況差這種情況,此時服務(wù)端在從一開始發(fā)送數(shù)據(jù)到緩沖區(qū)滿的期間數(shù)據(jù)是不會丟的,因為存緩沖區(qū)了,但是滿了以后要是還是繼續(xù)發(fā)的話,數(shù)據(jù)包就會丟棄。
所以這種情況下的一般解決方案是控制流量:
$connection->onBufferFull = function($connection){
//暫停發(fā)送
}
$connection->onBufferDrain = function($connection){
//繼續(xù)發(fā)送
}