onBufferFull
说明:
callback Worker::$onBufferFull
每個連接都有一個單獨的應用層發送緩衝區,如果客戶端接收速度小於服務端發送速度,數據會在應用層緩衝區暫存,如果緩衝區滿則會觸發onBufferFull回調。
緩衝區大為TcpConnection::$maxSendBufferSize,默認值為1MB,可以為當前連接動態設置緩衝區大小例如:
// 設置當前連接發送緩衝區,單位字節
$connection->maxSendBufferSize = 102400;
也可以利用TcpConnection::$defaultMaxSendBufferSize 設置所有連接默認緩衝區的大小,例如代碼:
use Workerman\Connection\TcpConnection;
// 設置所有連接的默認應用層發送緩衝區大小,單位字節
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
該回調可能會在調用Connection::send後立刻被觸發,比如發送大數據或者連續快速的向對端發送數據,由於網絡等原因數據被大量積壓在對應連接的發送緩衝區,當超過TcpConnection::$maxSendBufferSize上限時觸發。
當發生onBufferFull事件時,開發者一般需要採取措施,例如停止向對端發送數據,等待發送緩衝區的數據被發送完畢(onBufferDrain事件)等。
當調用Connection::send($A)後導致觸發onBufferFull時,不管本次send的數據$A多大,即使大於TcpConnection::$maxSendBufferSize,本次要發送的數據仍然會被放入發送緩衝區。也就是說發送緩衝區實際放入的數據可能遠遠大於TcpConnection::$maxSendBufferSize,當發送緩衝區的數據已經大於TcpConnection::$maxSendBufferSize時,仍然繼續Connection::send($B)數據,則這次send的$B數據不會放入發送緩衝區,而是被丟棄掉,並觸發onError回調。
總結來說,只要發送緩衝區還沒滿,哪怕只有一個字節的空間,調用Connection::send($A)肯定會把$A放入發送緩衝區,如果放入發送緩衝區後,發送緩衝區大小超過了TcpConnection::$maxSendBufferSize限制,則會觸發onBufferFull回調。
回調函數的參數
$connection
連接對象,即TcpConnection實例,用於操作客戶端連接,如發送數據,關閉連接等
範例
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";
};
// 運行worker
Worker::runAll();
提示:除了使用匿名函數作為回調,還可以參考這裡使用其它回調寫法。
參見
onBufferDrain 當連接的應用層發送緩衝區數據全部發送完畢時觸發