您可以使用令牌存储桶算法控制速率,该算法与泄漏存储桶算法相当。请注意,您必须在进程(或您要控制的任何范围)上共享存储桶的状态(即令牌数量)。因此,您可能需要考虑锁定以避免争用条件。
好消息是:我为您完成了所有这些工作:带宽限制/令牌桶
use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\storage\FileStorage;
$storage = new FileStorage(__DIR__ . "/api.bucket");
$rate = new Rate(10, Rate::SECOND);
$bucket = new TokenBucket(10, $rate, $storage);
$bucket->bootstrap(10);
if (!$bucket->consume(1, $seconds)) {
http_response_code(429);
header(sprintf("Retry-After: %d", floor($seconds)));
exit();
}