某些 API 在响应标头中返回速率限制信息。查看:
HTTP API 速率限制示例 HTTP 响应标头
此信息将帮助您等待几纳秒,然后再继续使用 PHP 的下一个请求time_nanosleep()
一些 PHP 库对速率限制的方式非常深入。Bucket Token 算法在网络上很常见:
https ://github.com/bandwidth-throttle/token-bucket
X-RateLimit-Remaining
现在,当涉及到限制一些在其返回标头中没有类似内容的 URL 请求时,我发现这有点矫枉过正。API 请求通常很慢。所以我在下面构建了 PHP 脚本。
这个 PHP 脚本将只等待几毫秒,基于$throttlerID
. 更高requestsInSeconds
将导致更短的等待时间...如果$throttlerID
在同时请求中使用相同的请求,则每个请求将使用 File-Locking ( ) 等待另一个请求FLOCK()
。
function Throttler($requestsInSeconds, $throttlerID) {
// Use FLOCK() to create a system global lock (it's crash-safe:))
$fp = fopen(sys_get_temp_dir()."/$throttlerID", "w+");
// exclusive lock will blocking wait until obtained
if (flock($fp, LOCK_EX)) {
// Sleep for a while (requestsInSeconds should be 1 or higher)
$time_to_sleep = 999999999 / $requestsInSeconds;
time_nanosleep(0, $time_to_sleep);
flock($fp, LOCK_UN); // unlock
}
fclose($fp);
}
在每次通话之前将通话放在Throttler()
右侧CURL
。而已!