onBufferFull
Descrizione:
callback Worker::$onBufferFull
Ogni connessione ha un buffer di invio a livello di applicazione separato. Se la velocità di ricezione del client è inferiore alla velocità di invio del server, i dati verranno temporaneamente memorizzati nel buffer di invio a livello di applicazione e, se il buffer è pieno, verrà attivata la callback onBufferFull.
Il buffer massimo è TcpConnection::$maxSendBufferSize, il cui valore predefinito è di 1 MB. È possibile impostare dinamicamente la dimensione del buffer per la connessione corrente, ad esempio:
// Imposta la dimensione del buffer di invio per la connessione corrente, in byte
$connection->maxSendBufferSize = 102400;
È anche possibile utilizzare TcpConnection::$defaultMaxSendBufferSize per impostare la dimensione predefinita del buffer di invio per tutte le connessioni, come mostrato nel seguente esempio:
use Workerman\Connection\TcpConnection;
// Imposta la dimensione predefinita del buffer di invio a livello di applicazione per tutte le connessioni, in byte
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
Questa callback potrebbe essere attivata immediatamente dopo la chiamata a Connection::send, ad esempio quando vengono inviati grandi dati o quando vengono inviati rapidamente dati al peer. A causa di problemi di rete, i dati vengono accumulati in modo massiccio nel buffer di invio della connessione corrispondente, attivando la callback quando si supera il limite di TcpConnection::$maxSendBufferSize
.
Quando si verifica l'evento onBufferFull, di solito è necessario adottare misure, come smettere di inviare dati al peer e attendere il completamento dell'invio dei dati nel buffer (evento onBufferDrain).
Quando si chiama Connection::send($A
) e si attiva onBufferFull, indipendentemente dalla dimensione dei dati $A
inviati questa volta, anche se superano TcpConnection::$maxSendBufferSize
, i dati da inviare verranno comunque inseriti nel buffer di invio. In altre parole, i dati effettivamente inseriti nel buffer di invio potrebbero essere molto superiori a TcpConnection::$maxSendBufferSize
. Quando la dimensione del buffer di invio supera TcpConnection::$maxSendBufferSize
, se si continua a inviare dati tramite Connection::send($B
), i dati $B
inviati questa volta non verranno inseriti nel buffer di invio, ma saranno scartati, attivando la callback onError
.
In breve, finché il buffer di invio non è pieno, anche con un solo byte di spazio disponibile, la chiamata a Connection::send($A
) aggiungerà sicuramente $A
al buffer di invio. Se, dopo l'inserimento nel buffer di invio, la dimensione del buffer supera il limite di TcpConnection::$maxSendBufferSize
, verrà attivata la callback onBufferFull.
Parametri della funzione di callback
$connection
Oggetto di connessione, cioè un'istanza di TcpConnection, utilizzato per operare sulla connessione del client, ad esempio invio dei dati, chiusura della connessione, ecc.
Esempi
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 pieno e non inviare di nuovo\n";
};
// Avvia il worker
Worker::runAll();
Nota: Oltre alla possibilità di utilizzare una funzione anonima come callback, è anche possibile utilizzare altri metodi di callback come indicato qui.
Vedi anche
onBufferDrain: Attivato quando tutti i dati nel buffer di invio a livello di applicazione della connessione sono stati inviati completamente