onBufferFull

Beschreibung:

callback Worker::$onBufferFull

Jede Verbindung hat einen eigenen Anwendungs-Schicht-Sende-Puffer. Wenn die Empfangsgeschwindigkeit des Clients langsamer ist als die Sendegeschwindigkeit des Servers, werden die Daten im Anwendungs-Schicht-Puffer zwischengespeichert. Wenn der Puffer voll ist, wird der onBufferFull-Callback aufgerufen.

Die Puffergröße beträgt TcpConnection::$maxSendBufferSize, der Standardwert beträgt 1 MB. Die Puffergröße kann dynamisch für die aktuelle Verbindung festgelegt werden, z. B.:

// Setzen Sie den Sendepuffer der aktuellen Verbindung, Einheit Bytes
$connection->maxSendBufferSize = 102400;

Es ist auch möglich, die Standardgröße des Anwendungs-Schicht-Sendepuffers für alle Verbindungen mit TcpConnection::$defaultMaxSendBufferSize festzulegen, z. B. mit folgendem Code:

use Workerman\Connection\TcpConnection;
// Setzen Sie die Standardgröße des Anwendungs-Schicht-Sendepuffers für alle Verbindungen, Einheit Bytes
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

Dieser Callback kann unmittelbar nach dem Aufruf von Connection::send ausgelöst werden, beispielsweise wenn große Daten oder kontinuierlich schnell Daten an die Gegenstelle gesendet werden. Aufgrund von Netzwerkproblemen oder ähnlichem können sich Daten im Sendepuffer der entsprechenden Verbindung stauen. Wenn das Limit von TcpConnection::$maxSendBufferSize überschritten wird, wird der Callback ausgelöst.

Wenn das onBufferFull-Ereignis auftritt, müssen Entwickler normalerweise Maßnahmen ergreifen, z. B. das Stoppen des Versands von Daten an die Gegenstelle und Warten, bis die Daten im Sendepuffer gesendet sind (onBufferDrain-Ereignis) usw.

Wenn der Aufruf von Connection::send($A) dazu führt, dass onBufferFull ausgelöst wird, wird die zu sendende Datenmenge $A, egal wie groß, auch dann in den Sendepuffer eingefügt, wenn sie größer ist als TcpConnection::$maxSendBufferSize. Das bedeutet, dass die tatsächlich in den Sendepuffer eingefügten Daten die TcpConnection::$maxSendBufferSize weit überschreiten können. Wenn die Daten im Sendepuffer bereits größer sind als TcpConnection::$maxSendBufferSize, und weiterhin Connection::send($B) aufgerufen wird, wird die Datenmenge $B nicht in den Sendepuffer eingefügt, sondern verworfen und löst den onError-Callback aus.

Zusammenfassend lässt sich sagen: Solange der Sendepuffer nicht voll ist, wird unabhängig von der Größe immer Connection::send($A) den Inhalt von $A in den Sendepuffer einfügen. Falls die Größe des Sendepuffers nach dem Einfügen die Grenze von TcpConnection::$maxSendBufferSize überschreitet, wird der onBufferFull-Callback ausgelöst.

Parameter der Callback-Funktion

$connection

Das Verbindungsobjekt, also eine TcpConnection-Instanz, das zum Steuern der Client-Verbindung verwendet wird, wie z.B. Daten senden, Verbindung schließen usw.

Beispiel

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 starten
Worker::runAll();

Hinweis: Neben der Verwendung von anonymen Funktionen als Callback können Sie hier andere Callback-Schreibweisen nutzen.

Siehe auch

onBufferDrain Wird ausgelöst, wenn die Daten im Anwendungs-Schicht-Sendepuffer der Verbindung vollständig gesendet sind.