手冊原文:
**每個連接都有一個單獨的應用層發(fā)送緩沖區(qū),緩沖區(qū)大小由TcpConnection::$maxSendBufferSize決定,默認值為1MB,可以手動設置更改大小,更改后會對所有連接生效。
該回調(diào)在應用層發(fā)送緩沖區(qū)數(shù)據(jù)全部發(fā)送完畢后觸發(fā)。一般與onBufferFull配合使用,例如在onBufferFull時停止向?qū)Χ死^續(xù)send數(shù)據(jù),在onBufferDrain恢復寫入數(shù)據(jù)。**
具體怎么實現(xiàn)以上邏輯????
停止send邏輯要自己想,各個場景方法可能不一樣。
比如發(fā)現(xiàn)onBufferFull了,給這個連接弄個緩沖區(qū)已滿的標識,當要給這個連接send數(shù)據(jù)前,判斷下這個標記,如果標記為滿不再調(diào)用send發(fā)送,而是把數(shù)據(jù)者保存在磁盤里(或者直接丟棄),等onBufferDrain時從磁盤中讀取,然后再send給對方。
有點類似這個例子:
http://wenda.workerman.net/question/869
再比如workerman作為tcp代理時,A->Workerman->B這種,當B的緩沖區(qū)onBufferFull時,可以利用pauseRecv停止對A的讀,這樣不會再有數(shù)據(jù)發(fā)送給B,也就不會調(diào)用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();
};
}