onBufferFull被调用后,怎么停止send???

luckyrin

手册原文:
**每个连接都有一个单独的应用层发送缓冲区,缓冲区大小由TcpConnection::$maxSendBufferSize决定,默认值为1MB,可以手动设置更改大小,更改后会对所有连接生效。

该回调在应用层发送缓冲区数据全部发送完毕后触发。一般与onBufferFull配合使用,例如在onBufferFull时停止向对端继续send数据,在onBufferDrain恢复写入数据。**

具体怎么实现以上逻辑????

阅读 2479
1个回答

walkor

停止send逻辑要自己想,各个场景方法可能不一样。

比如发现onBufferFull了,给这个连接弄个缓冲区已满的标识,当要给这个连接send数据前,判断下这个标记,如果标记为满不再调用send发送,而是把数据者保存在磁盘里(或者直接丢弃),等onBufferDrain时从磁盘中读取,然后再send给对方。
有点类似这个例子:
http://wenda.workerman.net/question/869
再比如workerman作为tcp代理时,A->Workerman->B这种,当B的缓冲区onBufferFull时,可以利用pauseRecv停止对A的读,这样不会再有数据发送给B,也就不会调用send。

这个可以参考workerman的 http://doc.workerman.net/tcp-connection/pipe.html 写法,
Workerman/Connection/TcpConnection.php

public function pipe($dest)
{
    $source              = $this;
    $this->onMessage     = function ($source, $data) use ($dest) {
        $dest->send($data);
    };
    $this->onClose       = function ($source) use ($dest) {
        $dest->destroy();
    };
    $dest->onBufferFull  = function ($dest) use ($source) {
        $source->pauseRecv();
    };
    $dest->onBufferDrain = function ($dest) use ($source) {
        $source->resumeRecv();
    };
}
  • luckyrin 2016-04-01

    多谢指点!我好好研究研究!