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