PHP将外部API请求总数限制为每秒8次

PHP将外部API请求总数限制为每秒8次,php,api,Php,Api,我的网站有一个脚本,当用户访问特定页面时,它将调用外部API。 当访问页面并以xml格式返回响应时,将发出API请求。 我使用的是通常的卷曲请求 现在,由于API端的新实现,如果API收到太多请求,它将抛出异常并拒绝请求。 我想将我的网站对API的总调用次数限制为每秒仅8次 我怎样才能做到这一点?有人建议我对请求进行排队,但我以前从未做过类似的事情,我很难找到解决方案。 对不起,如果我的英语有错误。感谢您的帮助 例如:如果100个用户同时访问该网页,我需要在每秒8次之后将这些API请求排队8次,

我的网站有一个脚本,当用户访问特定页面时,它将调用外部API。 当访问页面并以xml格式返回响应时,将发出API请求。
我使用的是通常的卷曲请求

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

我怎样才能做到这一点?有人建议我对请求进行排队,但我以前从未做过类似的事情,我很难找到解决方案。
对不起,如果我的英语有错误。感谢您的帮助

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

$currentCount=0;
$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++;
     }
}
$currentSeconds; 函数callAPI() {
如果($currentCount我建议您使用一个api生成令牌,并在每个请求上匹配令牌,并在一段时间后执行到期或删除令牌。这样可以解决您的多个请求问题。

您可以将api请求延迟几微秒,下面是示例代码

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

function _callAPI(){
 // Your code here
}
当用户访问您的站点时,请求将在几微秒后触发,这样您就可以延迟请求


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

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

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

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


内存占用更少。

为什么不创建一个某种变量来计算每次调用的数量,然后将其与时间进行逻辑比较。无论如何,您都在记录每次调用。因此,如果$time=1秒,$calls=8,就不要再调用了。@RussJ感谢您的回答。您能为我提供一个如何实现这一点的示例代码流吗?非常感谢。请参阅下面的代码。如果它有帮助,请接受它。谢谢您的回答。您能详细说明一下吗?很抱歉,我无法理解。请注意,
currentCount
对于每个请求都将
0
,除非您将值保存在数据存储(数据库、文件等)中谢谢你的回答。但API的要求是在1秒内有8个或更少的请求。因此,例如,如果100个用户同时访问网页,我需要在每秒8个之后排队等待这些API请求,依此类推,直到所有操作完成。延迟请求是否可以实现这一点?非常感谢。在这种情况下,您可以维护在上一个请求时间的日志中,将下一个请求延迟几微秒…1秒=10000,00这意味着您可以发送8个请求如果您将请求延迟1,25000毫秒,您可以使用时间戳作为时间间隔