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();
};
}
停止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
多谢指点!我好好研究研究!