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 當連線的應用層發送緩衝區數據全部發送完畢時觸發