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