onBufferFull
Descrição:
callback Worker::$onBufferFull
Cada conexão possui um buffer de envio separado na camada de aplicação. Se a velocidade de recepção do cliente for menor que a velocidade de envio do servidor, os dados serão armazenados temporariamente no buffer da camada de aplicação. Se o buffer estiver cheio, o callback onBufferFull será acionado.
O tamanho do buffer é determinado por TcpConnection::$maxSendBufferSize, cujo valor padrão é 1 MB. O tamanho do buffer pode ser definido dinamicamente para a conexão atual, por exemplo:
// Define o buffer de envio da conexão atual, em bytes
$connection->maxSendBufferSize = 102400;
Também é possível usar TcpConnection::$defaultMaxSendBufferSize para definir o tamanho do buffer padrão de todas as conexões, como no código:
use Workerman\Connection\TcpConnection;
// Define o tamanho do buffer de envio padrão da camada de aplicação para todas as conexões, em bytes
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
Esse callback pode ser acionado imediatamente após a chamada de Connection::send, por exemplo, ao enviar grandes volumes de dados ou ao enviar dados rapidamente para o outro lado. Devido a problemas de rede, os dados podem se acumular no buffer de envio da conexão correspondente. Quando o limite de TcpConnection::$maxSendBufferSize é ultrapassado, o callback é acionado.
Quando o evento onBufferFull ocorre, o desenvolvedor geralmente precisa tomar medidas, como parar de enviar dados para o outro lado ou aguardar que os dados no buffer de envio sejam concluídos (evento onBufferDrain).
Quando a chamada Connection::send($A) resulta no acionamento de onBufferFull, independentemente do tamanho dos dados enviados na ocasião, mesmo que exceda TcpConnection::$maxSendBufferSize, os dados a serem enviados ainda serão colocados no buffer de envio. Em outras palavras, os dados efetivamente colocados no buffer de envio podem ser muito maiores que TcpConnection::$maxSendBufferSize. Quando os dados no buffer de envio já ultrapassam TcpConnection::$maxSendBufferSize, e há uma nova chamada para Connection::send($B), os dados $B não serão colocados no buffer de envio, mas sim descartados, acionando 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 colocará $A no buffer de envio. Se, após a inserção, o tamanho do buffer de envio exceder o limite de TcpConnection::$maxSendBufferSize, o callback onBufferFull será acionado.
Parâmetros da função de callback
$connection
Objeto de conexão, ou seja, uma instância de TcpConnection, utilizada para operar a conexão do cliente, como enviar dados, fechar a conexão, entre outros.
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 "bufferFull e não enviar novamente\n";
};
// Executa o worker
Worker::runAll();
Dica: Além de usar funções anônimas como callback, você também pode consultar aqui para usar outros formatos de callback.
Veja também
onBufferDrain é acionado quando todos os dados no buffer de envio da camada de aplicação da conexão foram enviados.