如何限制来自 PHP 应用程序的外部 API 调用
How to limit external API calls from PHP app
我有一个 PHP 应用程序,每分钟调用太多,使外部 API 超载。我需要将它限制为每分钟只有 20 个调用,但我似乎无法弄清楚。我研究了这个问题并发现 and that,但是缺少适当的文档,我不知道它是如何工作的。我知道这叫做 "rate limiting",但我想我在学校跳过了它。
我的应用只是循环发送 cURL 请求。我在程序中有几个循环 运行 来收集所有这些信息。我可以用定时器限制一个循环每分钟 20 个,但我有 17 个循环 运行 并且我有循环中的循环。是否可以只用一个助手或其他东西限制我的 PHP 应用程序中的所有 cURL 请求而不编辑我的所有代码?
无法使用任何内置功能对 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
}
但是,这只会限制此特定脚本的速率。如果你执行另一个,那么你将启动另一个计数器。或者,您可以将一些循环 table 存储在平面文件或数据库中,并在每次要调用 API.
时检查它
对于高级用法,您应该查看消息队列或 ReactPHP。如果这样的功能会暴露给最终用户,您不希望挂起您的服务器。
我有一个 PHP 应用程序,每分钟调用太多,使外部 API 超载。我需要将它限制为每分钟只有 20 个调用,但我似乎无法弄清楚。我研究了这个问题并发现
我的应用只是循环发送 cURL 请求。我在程序中有几个循环 运行 来收集所有这些信息。我可以用定时器限制一个循环每分钟 20 个,但我有 17 个循环 运行 并且我有循环中的循环。是否可以只用一个助手或其他东西限制我的 PHP 应用程序中的所有 cURL 请求而不编辑我的所有代码?
无法使用任何内置功能对 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
}
但是,这只会限制此特定脚本的速率。如果你执行另一个,那么你将启动另一个计数器。或者,您可以将一些循环 table 存储在平面文件或数据库中,并在每次要调用 API.
时检查它对于高级用法,您应该查看消息队列或 ReactPHP。如果这样的功能会暴露给最终用户,您不希望挂起您的服务器。