onBufferFull

Descrição:

callback Worker::$onBufferFull

Cada conexão possui um buffer de envio de camada de aplicação separado. Se a velocidade de recebimento do cliente for menor do que a velocidade de envio do servidor, os dados serão temporariamente armazenados no buffer de camada de aplicação e, se o buffer estiver cheio, o callback onBufferFull será acionado.

O tamanho do buffer é definido por TcpConnection::$maxSendBufferSize, com valor padrão de 1 MB. O tamanho do buffer pode ser configurado dinamicamente para a conexão atual, por exemplo:

// Definir o tamanho do buffer de envio para a conexão atual, em bytes
$connection->maxSendBufferSize = 102400;

Também é possível usar TcpConnection::$defaultMaxSendBufferSize para definir o tamanho padrão do buffer para todas as conexões, como no exemplo a seguir:

use Workerman\Connection\TcpConnection;
// Definir o tamanho padrão do buffer de envio de camada de aplicação para todas as conexões, em bytes
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

Este callback pode ser acionado imediatamente após a chamada Connection::send, como no caso de envio de grandes quantidades de dados ou envio rápido e contínuo de dados para o outro lado devido a problemas de rede, resultando em uma grande acumulação de dados no buffer de envio da conexão correspondente, acionando o callback quando excede o limite de TcpConnection::$maxSendBufferSize.

Quando ocorre o evento onBufferFull, geralmente é necessário que o desenvolvedor tome medidas, como parar de enviar dados para o outro lado e aguardar a conclusão do envio dos dados no buffer (evento onBufferDrain), entre outras ações.

Quando a chamada Connection::send($A) aciona o onBufferFull, independentemente do tamanho dos dados $A enviados, mesmo que exceda o TcpConnection::$maxSendBufferSize, os dados a serem enviados ainda serão armazenados no buffer de envio. Em outras palavras, o tamanho real do buffer de envio pode ser muito maior que TcpConnection::$maxSendBufferSize. Quando o buffer de envio já contém mais dados do que TcpConnection::$maxSendBufferSize, se a operação Connection::send($B) for executada, os dados $B desta operação serão descartados e acionarão o callback onError.

Resumindo, enquanto o buffer de envio não estiver cheio, mesmo que haja apenas um byte de espaço, a chamada Connection::send($A) certamente irá armazenar o $A no buffer de envio. Se, após o armazenamento no buffer de envio, o tamanho do buffer ultrapassar o limite de TcpConnection::$maxSendBufferSize, o callback onBufferFull será acionado.

Parâmetros da função de retorno

$connection

O objeto de conexão, ou seja, a instância TcpConnection, usado para operar a conexão do cliente, como enviar dados, fechar a conexão, entre outras operações.

Exemplo

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 "Buffer cheio e não enviar novamente\n";
};
// Executar o worker
Worker::runAll();

Nota: Além de usar uma função anônima como callback, também é possível usar outros métodos de callback como referência.

Veja também

onBufferDrain Quando todos os dados no buffer de envio da camada de aplicação da conexão forem enviados completamente