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 コールバックがトリガーされます。
要するに、送信バッファがまだ満杯でない限り、たとえ1バイトの空きスペースしかなかったとしても、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 接続のアプリケーション層送信バッファのデータがすべて送信完了したときにトリガーされます。