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

时间:2019-02-27 03:32:19

标签: php api

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

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

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

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

4 个答案:

答案 0 :(得分:0)

{{1}}

对于每个API调用:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

function _callAPI(){
 // Your code here
}

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

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

答案 3 :(得分:0)

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

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

如果负载非常高(1000+ cps),Aerospike最适合此操作,它提供了非常低的延迟。 Cassandra使用起来更简单,并且需要更少的内存。

减少了甚至更少的内存。