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, независимо от того, сколько данных в текущем send $A, даже если превышает TcpConnection::$maxSendBufferSize, данные, которые должны быть отправлены, все равно будут помещены в буфер отправки. Это означает, что фактически помещаемые в буфер отправки данные могут значительно превышать TcpConnection::$maxSendBufferSize. Если данные в буфере отправки уже превышают TcpConnection::$maxSendBufferSize, и продолжать выполнять Connection::send($B), данные этого send $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 "bufferFull and do not send again\n";
};
// Запуск worker
Worker::runAll();

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

См. также

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