onBufferFull

Описание:

callback Worker::$onBufferFull

У каждого соединения есть отдельный буфер отправки на уровне приложения. Если скорость приема данных клиентом меньше скорости отправки сервером, данные будут временно сохраняться в буфере приложения. Если буфер заполнен, будет вызван обратный вызов onBufferFull.

Размер буфера определяется как TcpConnection::$maxSendBufferSize, со значением по умолчанию 1 МБ. Размер буфера можно динамически изменить для текущего соединения, например:

// Установка максимального размера буфера отправки для текущего соединения в байтах
$connection->maxSendBufferSize = 102400;

Также можно использовать TcpConnection::$defaultMaxSendBufferSize для установки размера буфера по умолчанию для всех соединений, например:

use Workerman\Connection\TcpConnection;
// Установка размера буфера отправки по умолчанию для всех соединений в байтах
TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;

Этот обратный вызов может быть вызван сразу после вызова Connection::send, например, при отправке больших данных или при быстрой последовательной отправке данных на конечный узел из-за некоторых сетевых проблем. Это происходит, когда большое количество данных накапливается в буфере отправки соответствующего соединения и превышает предел TcpConnection::$maxSendBufferSize.

Когда происходит событие onBufferFull, разработчику обычно необходимо предпринимать меры, такие как приостановка отправки данных на конечный узел, ожидание, пока данные из буфера отправки не будут отправлены (событие onBufferDrain) и т.д.

Когда вызывается Connection::send($A) и приводит к вызову onBufferFull, независимо от размера отправляемых данных $A, даже если размер отправляемых данных $A превышает TcpConnection::$maxSendBufferSize, эти данные все равно будут помещены в буфер отправки. Другими словами, фактически размер данных, помещаемых в буфер отправки, может значительно превышать TcpConnection::$maxSendBufferSize. Если размер данных в буфере отправки достиг размера TcpConnection::$maxSendBufferSize и после этого вызывается Connection::send($B), данные $B не будут помещены в буфер отправки, а будут отброшены, и будет вызван обратный вызов onError.

Таким образом, пока буфер отправки не полон, даже если есть только один байт свободного места, вызов Connection::send($A) обязательно поместит данные $A в буфер отправки. Если после помещения данных в буфер отправки размер буфера превысит лимит, установленный в TcpConnection::$maxSendBufferSize, будет вызван обратный вызов onBufferFull.

Параметры функции обратного вызова

$connection

Объект соединения, то есть экземпляр TcpConnection, используемый для работы с клиентским соединением, такой как отправка данных, закрытие соединения и т.д.

Пример

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 "буфер переполнен и отправка данных не продолжается\n";
};
// Запуск воркера
Worker::runAll();

Примечание: помимо использования анонимной функции в качестве обратного вызова, также можно посмотреть здесь другие способы написания обратного вызова.

См. также

onBufferDrain Вызывается, когда все данные из буфера отправки уровня приложения соединения были отправлены.