php应用容器workerman_worker类回调属性onBufferFull说明及范例
2021/12/14 20:16:55
本文主要是介绍php应用容器workerman_worker类回调属性onBufferFull说明及范例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
回调属性onBufferFull说明
callback Worker::$onBufferFull
每个连接都有一个单独的应用层发送缓冲区,如果客户端接收速度小于服务端发送速度,数据会在应用层缓冲区暂存,如果缓冲区满则会触发onBufferFull回调。
缓冲区大为TcpConnection::$maxSendBufferSize
,默认值为1MB,可以为当前连接动态设置缓冲区大小例如:
// 设置当前连接发送缓冲区,单位字节 $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实例,用于操作客户端连接,如发送数据,关闭连接等。
回调属性onBufferFull范例
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();
这篇关于php应用容器workerman_worker类回调属性onBufferFull说明及范例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享