【问题标题】:How to limit external API calls from PHP app如何限制来自 PHP 应用程序的外部 API 调用
【发布时间】:2020-01-01 03:57:51
【问题描述】:
我有一个 PHP 应用程序使外部 API 过载,每分钟调用次数过多。我需要将其限制为每分钟仅 20 个呼叫,但我似乎无法弄清楚。我研究了这个问题并找到了this 和that,但是缺少适当的文档,我不知道它是如何工作的。我知道这被称为“速率限制”,但我想我在学校跳过了它。
我的应用只是循环发送 cURL 请求。我在程序中运行了几个循环来收集所有这些信息。我可以用一个计时器将一个循环限制为每分钟 20 个,但我有 17 个循环正在运行,并且我在循环中有循环。是否可以使用单个帮助程序或其他东西来限制我的 PHP 应用程序中的所有 cURL 请求而不编辑我的所有代码?
【问题讨论】:
标签:
php
api
loops
web
rate-limiting
【解决方案1】:
没有办法限制使用任何内置功能的 PHP 函数。您可以编写一些简单的包装器,它每分钟仅调用 API 给定的次数。一个粗略的示例如下所示:
function callAPI($api) {
static $lastRequest;
$maxRequestsPerMin = 20;
if (isset($lastRequest)) {
$delay = 60 / $maxRequestsPerMin; // 60 seconds / $maxRequestsPerMin
if ((microtime(true) - $lastRequest) < $delay) {
// Sleep until the delay is reached
$sleepAmount = ($delay - microtime(true) + $lastRequest) * (1000 ** 2);
usleep($sleepAmount);
}
}
$lastRequest = microtime(true);
// Call you API here
}
但是,这只会限制此特定脚本的速率。如果您执行另一个,那么您将启动另一个计数器。或者,您可以将一些循环表存储在平面文件或数据库中,并在每次要调用 API 时对其进行检查。
对于高级用法,您应该查看消息队列或 ReactPHP。如果此类功能会暴露给最终用户,您不希望挂起您的服务器。