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 вызывется, когда данные в буфере отправки на уровне приложения соединения полностью отправлены.