onBufferFull
Descripción:
callback Worker::$onBufferFull
Cada conexión tiene un búfer de envío específico de la capa de aplicación. Si la velocidad de recepción del cliente es menor que la velocidad de envío del servidor, los datos se almacenarán en el búfer de la capa de aplicación. Si el búfer se llena, se activará el callback onBufferFull.
El tamaño del búfer es TcpConnection::$maxSendBufferSize, cuyo valor predeterminado es 1MB. Se puede establecer dinámicamente el tamaño del búfer para la conexión actual, por ejemplo:
// Establecer el búfer de envío de la conexión actual, en bytes
$connection->maxSendBufferSize = 102400;
También se puede usar TcpConnection::$defaultMaxSendBufferSize para establecer el tamaño predeterminado del búfer de todas las conexiones. Por ejemplo, el siguiente código:
use Workerman\Connection\TcpConnection;
// Establecer el tamaño del búfer de envío de la capa de aplicación por defecto para todas las conexiones, en bytes
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
Este callback puede ser activado inmediatamente después de llamar a Connection::send, por ejemplo, al enviar grandes cantidades de datos o al enviar datos de forma rápida y continua al lado opuesto. Debido a razones de red u otras, los datos se acumulan en el búfer de envío de la conexión correspondiente, y esto se activará cuando supere el límite de TcpConnection::$maxSendBufferSize.
Cuando ocurre el evento onBufferFull, los desarrolladores generalmente necesitan tomar medidas, como detener el envío de datos al lado opuesto y esperar a que se envíen los datos del búfer de envío (evento onBufferDrain), entre otras.
Cuando se llama a Connection::send($A) y esto provoca que se active onBufferFull, no importa cuán grande sea el dato que se envía en esta ocasión $A, incluso si es mayor que TcpConnection::$maxSendBufferSize, los datos a enviar todavía se colocarán en el búfer de envío. Es decir, los datos efectivamente colocados en el búfer de envío pueden ser mucho mayores que TcpConnection::$maxSendBufferSize. Si los datos en el búfer de envío ya superan TcpConnection::$maxSendBufferSize, y aún así se continúa con Connection::send($B), los datos de esta vez $B no se colocarán en el búfer de envío, sino que se descartarán, lo que provocará la activación del callback onError.
En resumen, mientras el búfer de envío no esté lleno, incluso si solo hay un byte de espacio, llamar a Connection::send($A) definitivamente colocará $A en el búfer de envío. Si después de colocar en el búfer de envío, el tamaño del búfer de envío supera el límite de TcpConnection::$maxSendBufferSize, se activará el callback onBufferFull.
Parámetros de la función de callback
$connection
Objeto de conexión, es decir, una instancia de TcpConnection, utilizado para operar la conexión del cliente, como enviar datos, cerrar conexión, etc.
Ejemplo
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";
};
// Ejecutar worker
Worker::runAll();
Nota: Además de utilizar funciones anónimas como callback, también se puede consultar aquí para usar otros formatos de callback.
Ver también
onBufferDrain se activa cuando todos los datos del búfer de envío de la capa de aplicación de la conexión se han enviado completamente.