onBufferFull
Açıklama:
callback Worker::$onBufferFull
Her bağlantının ayrı bir uygulama katmanı gönderme tamponu vardır. Eğer istemcinin alma hızı, sunucunun gönderme hızından daha düşükse, veriler uygulama katmanı tamponunda birikmeye başlar. Eğer tampon dolarsa, onBufferFull geri çağrısı tetiklenir.
Tampon boyutu TcpConnection::$maxSendBufferSize ile belirlenir; varsayılan değeri 1MB'dir. Mevcut bağlantının tampon boyutu dinamik olarak ayarlanabilir, örneğin:
// Mevcut bağlantının gönderme tamponunu ayarlayın, birim byte
$connection->maxSendBufferSize = 102400;
Ayrıca, tüm bağlantılar için varsayılan tampon boyutunu ayarlamak için TcpConnection::$defaultMaxSendBufferSize kullanılabilir; örneğin:
use Workerman\Connection\TcpConnection;
// Tüm bağlantıların varsayılan uygulama katmanı gönderme tamponu boyutunu ayarlayın, birim byte
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;
Bu geri çağrı, Connection::send çağrısından sonra hemen tetiklenebilir; örneğin büyük veri gönderildiğinde veya hızlı bir şekilde ardışık veri gönderildiğinde. Ağ gibi nedenlerden ötürü veriler, ilgili bağlantının gönderme tamponunda birikir ve eğer TcpConnection::$maxSendBufferSize sınırı aşılırsa tetiklenir.
onBufferFull olayı gerçekleştiğinde, geliştiricilerin genellikle önlem alması gerekir; örneğin, karşı tarafa veri göndermeyi durdurmak, gönderme tamponundaki verilerin tamamlanmasını beklemek (onBufferDrain olayı) gibi.
Connection::send($A) çağrısı onBufferFull'u tetiklediğinde, gönderilen veri $A ne kadar büyük olursa olsun, hatta TcpConnection::$maxSendBufferSize'dan büyük olsa bile, bu sefer gönderilecek veri yine de gönderme tamponuna yerleştirilecektir. Yani, gönderme tamponuna yerleştirilen veri, TcpConnection::$maxSendBufferSize'dan çok daha büyük olabilir; gönderme tamponundaki veri, TcpConnection::$maxSendBufferSize'yı aşarsa ve Connection::send($B) verisi gönderilmeye çalışılırsa, bu seferki $B verisi gönderme tamponuna yerleştirilmeyecek, atılacak ve onError geri çağrısını tetikleyecektir.
Özetle, eğer gönderme tamponu henüz dolmamışsa, bir byte bile alan varsa, Connection::send($A) çağrısı kesinlikle $A'yı gönderme tamponuna yerleştirecektir. Eğer gönderme tamponuna yerleştirildikten sonra, gönderme tamponunun boyutu TcpConnection::$maxSendBufferSize sınırını aşarsa, onBufferFull geri çağrısı tetiklenir.
Geri Çağrı Fonksiyonunun Parametreleri
$connection
Bağlantı nesnesi, yani TcpConnection örneği; istemci bağlantısını yönetmek için kullanılır, örneğin veri gönderme, bağlantıyı kapatma gibi.
Örnek
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 ve tekrar gönderme\n";
};
// worker'ı çalıştır
Worker::runAll();
Not: Geri çağrı olarak anonim fonksiyon kullanmanın yanı sıra, burayı referans alarak diğer geri çağrı yazım stillerini de kullanabilirsiniz.
Kaynaklar
onBufferDrain, bağlantının uygulama katmanı gönderme tamponundaki verilerin tamamen gönderildiğinde tetiklenir.