首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带宽延迟-节流/令牌桶(PHP)

带宽延迟-节流/令牌桶(PHP)
EN

Stack Overflow用户
提问于 2016-05-03 11:39:37
回答 1查看 489关注 0票数 1

我将https://github.com/bandwidth-throttle/token-bucket用于仅限于外部服务器的查询。我的代码:

代码语言:javascript
复制
function main() {
    unlink(__DIR__ . "/api.bucket2");
    $storage  = new FileStorage(__DIR__ . "/api.bucket2");
    $rate     = new Rate(3, Rate::SECOND);
    $bucket   = new TokenBucket(3, $rate, $storage);
    $bucket->bootstrap(3);
    $consumer = new BlockingConsumer($bucket);

    for ($i = 0; $i < 12; $i++) {
        $consumer->consume(1);

        work();
    }
}

function work() {
    echo date("d.m.Y H:i:s") . substr((string)microtime(), 1, 4) . "\n";
}

main();

结果:

代码语言:javascript
复制
-bash-4.2$ php -f worker-test.php
03.05.2016 14:26:16.785
03.05.2016 14:26:16.785
03.05.2016 14:26:16.786
03.05.2016 14:26:17.118
03.05.2016 14:26:17.451
03.05.2016 14:26:17.784
...

我预计这个函数将以每秒3次的速度调用,但事实并非如此。前6个电话是在1秒内。如果我在“$bucket->bootstrap(0)”上更改"$bucket->bootstrap(3);“,则会更好:

代码语言:javascript
复制
03.05.2016 14:33:34.913
03.05.2016 14:33:35.245
03.05.2016 14:33:35.578
03.05.2016 14:33:35.911
...

但它仍然是超过3每秒。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-03 17:53:47

$桶->引导(3);

TokenBucket::bootstrap(3)将三个初始令牌放入桶中。这些初始的令牌可以立即被消耗掉。你实际上并没有控制那些第一次通话的费率。

如果您不想要初始的突发,您可以正确地引导没有任何标记的引导。

14:33:35.245 03.05.2016 14:33:35.578 03.05.2016 14:33:35.911 但它仍然是超过3每秒。

我数到每秒3次。请容忍这个观测到的±1ms的变异。从长远来看,平均每秒3次。

这±1ms可能来自此实现细节 of BlockingConsumer

代码语言:javascript
复制
// sleep at least 1 millisecond.
usleep(max(1000, $seconds * 1000000));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37003122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档