客户端网络状况差的时候,服务端向客户端发消息,会不会存在数据丢失的情况?如果有,那怎么解决呢?
这个理论上是涉及内核socket缓冲区的读写,结合workerman的还有个应用缓冲区的读写,这里你可以简单的理解为有一层数据缓冲区即可,我们拿其中的一端比如服务端来来说【客户端道理一样的】理论上当数据缓冲区满了的时候,意味着对端的客户端已经无法读取数据或者读取的速度远慢于服务端,也就是缓冲区不可再写,比如遇上客户端网络状况差这种情况,此时服务端在从一开始发送数据到缓冲区满的期间数据是不会丢的,因为存缓冲区了,但是满了以后要是还是继续发的话,数据包就会丢弃。
所以这种情况下的一般解决方案是控制流量:
$connection->onBufferFull = function($connection){ //暂停发送 } $connection->onBufferDrain = function($connection){ //继续发送 }
这个理论上是涉及内核socket缓冲区的读写,结合workerman的还有个应用缓冲区的读写,这里你可以简单的理解为有一层数据缓冲区即可,我们拿其中的一端比如服务端来来说【客户端道理一样的】理论上当数据缓冲区满了的时候,意味着对端的客户端已经无法读取数据或者读取的速度远慢于服务端,也就是缓冲区不可再写,比如遇上客户端网络状况差这种情况,此时服务端在从一开始发送数据到缓冲区满的期间数据是不会丢的,因为存缓冲区了,但是满了以后要是还是继续发的话,数据包就会丢弃。
所以这种情况下的一般解决方案是控制流量: