【问题标题】:Throttling / Rate Limiting in PHPPHP 中的节流/速率限制
【发布时间】:2015-02-25 13:50:48
【问题描述】:

我正在使用限制为1 query per second 的亚马逊产品广告 API。我发现这个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;
    }
}

【问题讨论】:

    标签: php throttling rate-limiting


    【解决方案1】:

    遍历您的查询列表,但在每个循环中获取一个 unix 时间戳(以秒为单位),并且仅在时间戳高于您上次发送查询时发送查询,然后记录时间戳以签入下一个循环。

    如果您的目标是确保每秒发送的次数不超过一次,但又不想浪费时间,那么循环可能比 if 更好:

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

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

    【讨论】:

      【解决方案2】:

      您还需要在进程之间共享状态以共享速率。我建议使用我的库:bandwidth-throttle/token-bucket

      $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();
      

      【讨论】:

        【解决方案3】:
        $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() 的速率限制。

        【讨论】:

          猜你喜欢
          • 2019-12-25
          • 1970-01-01
          • 2015-03-19
          • 2018-05-04
          • 2020-08-02
          • 1970-01-01
          • 1970-01-01
          • 2021-05-15
          • 1970-01-01
          相关资源
          最近更新 更多