您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
workerman回调onBufferFull(缓冲区溢出)
发布时间:2021-12-02 22:49:40编辑:雪饮阅读()
onBufferFull
说明:
callback Worker::$onBufferFull
每个连接都有一个单独的应用层发送缓冲区,如果客户端接收速度小于服务端发送速度,数据会在应用层缓冲区暂存,如果缓冲区满则会触发onBufferFull回调。
缓冲区大为TcpConnection::$maxSendBufferSize,默认值为1MB,可以为当前连接动态设置缓冲区大小例如:
// 设置当前连接发送缓冲区,单位字节
$connection->maxSendBufferSize = 102400;
该回调可能会在调用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实例,用于操作客户端连接,如发送数据,关闭连接等
实例:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onConnect=function(TcpConnection $connection){
$connection->maxSendBufferSize = 1024;
for($i=0;$i<10000;$i++){
$connection->send($i);
}
};
$worker->onBufferFull = function(TcpConnection $connection)
{
echo "bufferFull and do not send again\n";
};
// 运行worker
Worker::runAll();
?>
实例运行并在有websocket连接时:
[root@izj6c2jeancylo0ppo4vz5z workerman]# php test.php start
Workerman[test.php] start in DEBUG mode
------------------------------------------- WORKERMAN --------------------------------------------
Workerman version:4.0.22 PHP version:7.0.33
-------------------------------------------- WORKERS ---------------------------------------------
proto user worker listen processes status
tcp root none websocket://0.0.0.0:8484 1 [OK]
--------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
bufferFull and do not send again
关键字词:workerman,回调,onBufferFull,缓冲区,溢出,缓冲