通过睡眠限制while循环中的API?

时间:2011-02-20 16:42:37

标签: php

我需要在一段时间内睡觉。

API限制为每分钟300个请求。

3 个答案:

答案 0 :(得分:1)

Sleep()不是限制使用速率限制api的可靠方法(无论如何你应该使用usleep())。我认为你正在调用一个限制为每分钟300个请求的外部API?此外,速率限制的一点是您不会使API过载。在前10秒内拨打300次会使得速率限制失败,很可能会使您的系统被禁止。

在这种情况下,您应该每200毫秒(60秒/ 300)最多调用一次API

我会使用类似的东西(感谢@Codler代表你的答案中的代码)

$time1 = microtime(true);

while(true) {

    callTheAPI();

    $time2 = microtime(true);

    if (($time2 - $time1) * 1000 >= 200) {
        $time1 = $time2;
    } else {
        // usleep to make up for the 200 miliseconds 
        $sleep = ($time2 - $time1) * 1000;
        usleep($sleep);
        $time1 = microtime(true);
    } 
}

答案 1 :(得分:0)

while(myCondition)
{
  // request code
  $sleepTime = 5; /*time in seconds, find its optimum value so that you can use the API to its maximum */

  sleep($sleepTime);
}

答案 2 :(得分:0)

$time = microtime(true);
$i = 0;
while(true) {
    doSomething();
    $i++;
    if ($i >= 300) {
        $i = 0;

        // if it hasn't reached 60 seconds yet, sleep. 
        $sleep = microtime(true) - $time;
        if ($sleep < 60) {
            sleep(60 - $sleep);
        }
        $time = microtime(true);
    } 
}
?>