onBufferFull
說明:
callback Worker::$onBufferFull
每個(gè)連接都有一個(gè)單獨(dú)的應(yīng)用層發(fā)送緩沖區(qū),如果客戶端接收速度小于服務(wù)端發(fā)送速度,數(shù)據(jù)會(huì)在應(yīng)用層緩沖區(qū)暫存,如果緩沖區(qū)滿則會(huì)觸發(fā)onBufferFull回調(diào)。
緩沖區(qū)大為TcpConnection::$maxSendBufferSize,默認(rèn)值為1MB,可以為當(dāng)前連接動(dòng)態(tài)設(shè)置緩沖區(qū)大小例如:
// 設(shè)置當(dāng)前連接發(fā)送緩沖區(qū),單位字節(jié)
$connection->maxSendBufferSize = 102400;
也可以利用TcpConnection::$defaultMaxSendBufferSize 設(shè)置所有連接默認(rèn)緩沖區(qū)的大小,例如代碼:
use Workerman\Connection\TcpConnection;
// 設(shè)置所有連接的默認(rèn)應(yīng)用層發(fā)送緩沖區(qū)大小,單位字節(jié)
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
該回調(diào)可能會(huì)在調(diào)用Connection::send后立刻被觸發(fā),比如發(fā)送大數(shù)據(jù)或者連續(xù)快速的向?qū)Χ税l(fā)送數(shù)據(jù),由于網(wǎng)絡(luò)等原因數(shù)據(jù)被大量積壓在對(duì)應(yīng)連接的發(fā)送緩沖區(qū),當(dāng)超過TcpConnection::$maxSendBufferSize
上限時(shí)觸發(fā)。
當(dāng)發(fā)生onBufferFull事件時(shí),開發(fā)者一般需要采取措施,例如停止向?qū)Χ税l(fā)送數(shù)據(jù),等待發(fā)送緩沖區(qū)的數(shù)據(jù)被發(fā)送完畢(onBufferDrain事件)等。
當(dāng)調(diào)用Connection::send($A
)后導(dǎo)致觸發(fā)onBufferFull時(shí),不管本次send的數(shù)據(jù)$A
多大,即使大于TcpConnection::$maxSendBufferSize
,本次要發(fā)送的數(shù)據(jù)仍然會(huì)被放入發(fā)送緩沖區(qū)。也就是說發(fā)送緩沖區(qū)實(shí)際放入的數(shù)據(jù)可能遠(yuǎn)遠(yuǎn)大于TcpConnection::$maxSendBufferSize
,當(dāng)發(fā)送緩沖區(qū)的數(shù)據(jù)已經(jīng)大于TcpConnection::$maxSendBufferSize
時(shí),仍然繼續(xù)Connection::send($B
)數(shù)據(jù),則這次send的$B
數(shù)據(jù)不會(huì)放入發(fā)送緩沖區(qū),而是被丟棄掉,并觸發(fā)onError
回調(diào)。
總結(jié)來(lái)說,只要發(fā)送緩沖區(qū)還沒滿,哪怕只有一個(gè)字節(jié)的空間,調(diào)用Connection::send($A
)肯定會(huì)把$A
放入發(fā)送緩沖區(qū),如果放入發(fā)送緩沖區(qū)后,發(fā)送緩沖區(qū)大小超過了TcpConnection::$maxSendBufferSize
限制,則會(huì)觸發(fā)onBufferFull回調(diào)。
回調(diào)函數(shù)的參數(shù)
$connection
連接對(duì)象,即TcpConnection實(shí)例,用于操作客戶端連接,如發(fā)送數(shù)據(jù),關(guān)閉連接等
范例
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onBufferFull = function(TcpConnection $connection)
{
echo "bufferFull and do not send again\n";
};
// 運(yùn)行worker
Worker::runAll();
提示:除了使用匿名函數(shù)作為回調(diào),還可以參考這里使用其它回調(diào)寫法。
參見
onBufferDrain 當(dāng)連接的應(yīng)用層發(fā)送緩沖區(qū)數(shù)據(jù)全部發(fā)送完畢時(shí)觸發(fā)