我使用的是亚马逊产品广告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;
}
}
答案 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()
的速率限制。