onBufferFull
Descrizione:
callback Worker::$onBufferFull
Ogni connessione ha un buffer di invio a livello applicazione separato; se la velocità di ricezione del client è inferiore alla velocità di invio del server, i dati verranno memorizzati temporaneamente nel buffer a livello applicazione. Se il buffer è pieno, verrà attivato il callback onBufferFull.
La dimensione del buffer è stabilita da TcpConnection::$maxSendBufferSize, il valore predefinito è 1MB. È possibile impostare dinamicamente la dimensione del buffer per la connessione corrente, ad esempio:
// Imposta il buffer di invio per la connessione corrente, in byte
$connection->maxSendBufferSize = 102400;
È anche possibile utilizzare TcpConnection::$defaultMaxSendBufferSize per impostare la dimensione del buffer predefinito per tutte le connessioni, ad esempio il seguente codice:
use Workerman\Connection\TcpConnection;
// Imposta la dimensione del buffer di invio a livello applicazione predefinita per tutte le connessioni, in byte
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
Questo callback può essere attivato immediatamente dopo l'invocazione di Connection::send, ad esempio quando si inviano grandi quantità di dati o si inviano dati rapidamente in successione al peer. A causa di motivi di rete o simili, i dati possono accumularsi nel buffer di invio della connessione corrispondente; questo evento si attiva quando supera il limite di TcpConnection::$maxSendBufferSize.
Quando si verifica l'evento onBufferFull, gli sviluppatori di solito devono adottare misure, come fermarsi nell'invio di dati al peer e attendere che i dati nel buffer di invio vengano inviati completamente (evento onBufferDrain), ecc.
Quando l'invocazione di Connection::send($A) causa l'attivazione di onBufferFull, indipendentemente da quanto sia grande $A, anche se supera 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 i dati nel buffer di invio sono già superiori a TcpConnection::$maxSendBufferSize e si continua a inviare Connection::send($B), i dati di questa invocazione $B non verranno inseriti nel buffer di invio, ma verranno scartati, attivando il callback onError.
In sintesi, finché il buffer di invio non è pieno, anche se c'è spazio per un solo byte, l'invocazione di Connection::send($A) garantirà che $A venga inserito nel buffer di invio. Se dopo l'inserimento nel buffer, le dimensioni del buffer di invio superano il limite di TcpConnection::$maxSendBufferSize, verrà attivato il callback onBufferFull.
Parametri della funzione di callback
$connection
Oggetto di connessione, ovvero un'istanza di TcpConnection, utilizzata per operare su connessioni client, come inviare dati, chiudere la connessione, ecc.
Esempio
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 non inviare di nuovo\n";
};
// Esegui il worker
Worker::runAll();
Nota: oltre a usare una funzione anonima come callback, è possibile fare riferimento qui per utilizzare altri modi di scrivere il callback.
Vedi anche
onBufferDrain attivato quando tutti i dati nel buffer di invio a livello applicazione della connessione sono stati completamente inviati.