【问题标题】:PHP Limit total external API requests to 8 times per secondPHP 将外部 API 请求总数限制为每秒 8 次
【发布时间】:2019-07-20 17:02:22
【问题描述】:

我的网站有一个脚本,可以在用户访问特定页面时调用外部 API。 页面被访问时会发起 API 请求,并以 xml 格式返回响应。
我正在使用通常的 curl 请求。

目前,由于 API 端的新实现,如果 API 收到过多请求,它会抛出异常并拒绝请求。
我想将我的网站对 API 的总调用次数限制为每秒 8 次。

我怎样才能做到这一点?有人建议我对请求进行排队,但我以前从未做过这样的事情,而且我很难找到解决方案。
对不起,如果我的英语有错误。任何帮助表示赞赏。

例如:如果有 100 个用户同时访问该网页,我需要将这些 API 请求排入队列 8 后每秒 8 次,依此类推,直到全部完成。

【问题讨论】:

  • 为什么不创建某种变量来计算每次调用,然后放入一些逻辑来比较它与时间。无论如何,您都在记录每个呼叫。所以如果 $time=1 sec 和 $calls=8,就不要再打电话了。
  • @RussJ 谢谢你的回答。您能否为我提供有关如何实现该目标的示例代码流?非常感谢。
  • 见下面我的代码。如果有帮助,请采纳。

标签: php api


【解决方案1】:
$currentCount=0;
$currentSeconds;

function callAPI()
{
     if($currentCount<8 || date("s") != $currentSeconds)
     {

         if(date("s") != $currentSeconds)
         {
              $currentCount=0;
          }
         $currentSeconds=date("s");
     //call your API here
     $currentCount++;
     }
}

对于每个 API 调用:

-在变量中记录当前时间(仅秒)。
- 进行 API 调用。
- 增加呼叫计数器。
- 再次检查当前秒数是否等于之前存储的值,以及您的呼叫计数器是否低于 8。如果您的呼叫计数器低于 8,您可以拨打另一个电话。

【讨论】:

  • 请注意,对于每个请求,currentCount 将是 0,除非您将值保存在数据存储(数据库、文件等)中
【解决方案2】:

我建议您使用一个 api 生成来创建令牌并在每个请求上匹配令牌,并在一段时间后过期或删除令牌。所以可能会解决您的多个请求问题。

【讨论】:

  • 感谢您的回答。你能详细说明一下吗?很抱歉我听不懂。
【解决方案3】:

您可以将 API 请求延迟微秒,这里是示例代码

usleep(1250000);//1 sec = 10,000,00 ms

function _callAPI(){
 // Your code here
}

当用户访问您的网站时,请求将在几微秒后触发,这样您可以延迟请求。

您还可以在为 API 触发请求时维护日志,并根据上一个请求处理下一个请求。

【讨论】:

  • 感谢您的回答。但是 API 的要求是 1 秒内有 8 个或更少的请求。因此,例如,如果 100 个用户同时访问该网页,我需要每秒 8 次后将这些 API 请求排队 8 次,依此类推,直到全部完成。延迟请求是否可以使其实现这一目标?非常感谢。
  • 在这种情况下,您可以保留上一个请求时间的日志并将下一个请求延迟几微秒... 1 sec = 10,000,00 这意味着您可以发送 8 个请求,如果您是延迟请求 1,25,000 毫秒,您可以使用时间戳作为时间间隔
【解决方案4】:

每秒 8 次调用的值较低,因此可以将每次调用尝试保存在数据库中,并计算每次最后 5 秒的调用次数。

对于较大的值,通常在 Nosql 数据库(如 Cassandra 或 Aerospike)中使用计数器。 即对于每个请求,您都会获得当前时间并增加计数器名称“counter”+秒,直到获得所需的限制。

如果负载真的很高(1000+ cps),Aerospike 最适合这个,它提供非常低的延迟。 Cassandra 使用更简单,所需内存更少。

memcashed 的内存更少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2018-03-23
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多