onBufferFull

Description:

callback Worker::$onBufferFull

Chaque connexion dispose d'un tampon d'envoi d'application distinct. Si la vitesse de réception du client est inférieure à la vitesse d'envoi du serveur, les données sont mises en attente dans le tampon d'application. Si le tampon est plein, le rappel onBufferFull sera déclenché.

La taille du tampon est de TcpConnection::$maxSendBufferSize, la valeur par défaut étant de 1 Mo. La taille du tampon peut être définie dynamiquement pour la connexion actuelle, par exemple :

// Définir la taille du tampon d'envoi pour la connexion actuelle, en octets
$connection->maxSendBufferSize = 102400;

Il est également possible d'utiliser TcpConnection::$defaultMaxSendBufferSize pour définir la taille par défaut du tampon d'envoi pour toutes les connexions, par exemple le code :

use Workerman\Connection\TcpConnection;
// Définir la taille du tampon d'envoi d'application par défaut pour toutes les connexions, en octets
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

Ce rappel peut être déclenché immédiatement après l'appel de Connection::send, par exemple lors de l'envoi de grandes données ou en envoyant rapidement des données en continu au destinataire. En raison de problèmes de réseau et autres, les données sont fortement accumulées dans le tampon d'envoi de la connexion correspondante. Cela se déclenche lorsque cela dépasse la limite de TcpConnection::$maxSendBufferSize.

Lorsqu'un événement onBufferFull se produit, le développeur doit généralement prendre des mesures, telles que arrêter l'envoi de données au destinataire et attendre que les données du tampon d'envoi aient été envoyées (événement onBufferDrain), etc.

Lors de l'appel de Connection::send($A) qui déclenche onBufferFull, quelle que soit la taille des données $A envoyées lors de cet envoi, même si celles-ci dépassent TcpConnection::$maxSendBufferSize, les données à envoyer seront néanmoins placées dans le tampon d'envoi. Cela signifie que les données réellement mises dans le tampon d'envoi peuvent largement dépasser TcpConnection::$maxSendBufferSize. Lorsque les données dans le tampon d'envoi dépassent déjà TcpConnection::$maxSendBufferSize et que vous continuez à envoyer des données avec Connection::send($B), les données $B ne seront pas placées dans le tampon d'envoi, mais seront plutôt rejetées, ce qui déclenchera le rappel onError.

En résumé, tant que le tampon d'envoi n'est pas plein, même s'il reste un seul octet d'espace, l'appel à Connection::send($A) mettra sûrement $A dans le tampon d'envoi. Si après cela, la taille du tampon d'envoi dépasse la limite de TcpConnection::$maxSendBufferSize, cela déclenchera le rappel onBufferFull.

Paramètres de la fonction de rappel

$connection

Objet de connexion, c'est-à-dire une instance TcpConnection, utilisée pour gérer la connexion client, comme l'envoi de données, la fermeture de la connexion, etc.

Exemple

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 et ne pas envoyer à nouveau\n";
};
// Exécuter le worker
Worker::runAll();

Conseil : En plus d'utiliser des fonctions anonymes comme rappel, vous pouvez également vous référer ici pour utiliser d'autres écritures de rappel.

Voir aussi

onBufferDrain Déclenché lorsque toutes les données du tampon d'envoi de l'application de la connexion ont été complètement envoyées.