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