PHP中的限制/速率限制

时间:2015-02-25 13:50:49

标签: php throttling rate-limiting

我使用的是亚马逊产品广告API,其限制为1 query per second。我发现这library似乎做了我想做的事,但对我的要求来说有点过分。

除了使用sleep之外,是否有更简单的方法来限制速率(我调用函数)而不使用任何库,因为它会为1 second睡眠并且需要我需要的数量我要保存每一秒。

$array = range(1,100);

foreach ($array as $value) {
    $timestamp = time();
    if ($timestamp != time()) {
        echo "\n value: ".$value." ".$timestamp;
    } else {
        usleep(1000000);
        echo "\n value: ".$value." ".$timestamp;
    }
}

3 个答案:

答案 0 :(得分:1)

您还需要在流程之间共享状态以共享费率。我建议使用我的库:definition

$storage  = new FileStorage(__DIR__ . "/api.bucket");
$rate     = new Rate(1, Rate::SECOND);
$bucket   = new TokenBucket(1, $rate, $storage);
$consumer = new BlockingConsumer(bucket);
$bucket->bootstrap(1);

// This will block all your processes to an effective rate of 1/s
$consumer->consume(1);

echo $productApi->doSomething();

答案 1 :(得分:0)

循环查询列表,但在每个循环上获取一个unix时间戳(以秒为单位),只有在时间戳高于上次发送查询时才发送查询,然后记录时间戳以便检查下一循环。

如果你的目标是确保你不会每秒发送一次,但你不想腰部秒,那么循环可能比if if更好:

foreach ($array as $value) {
  $timestamp = time();
  while ($timestamp == time()) { 
   continue;
  } 
  doYourThing();
}

因此脚本将遍历您的列表,但是对于列表中的每个项目,它将继续旋转while循环,直到第二个结束时它将执行您的命令并直接进入下一个项目。

答案 2 :(得分:0)

$i=1;
foreach ($array as $value) {
    if($i==1) $timestamp = time();

    doYourThing();

    if($i==5){
        while ($timestamp == time()) { 
            continue;
        }
        $i=0;
    }
    $i++;
}

我将@Horaland代码修改为每秒5 doYourThing()的速率限制。