您可以使用令牌桶算法进行速率限制。我已经为你实现了:带宽限制/令牌桶
我还建议不要睡觉,因为您确实会阻止服务器的资源。只需使用 HTTP 状态码 429 退出:
use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\storage\MemcachedStorage;
$storage = new MemcachedStorage("resource", $memcached);
$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();
}
foo();
但是如果你真的想睡觉,你可以这样做BlockingConsumer
:
$consumer = new BlockingConsumer($bucket);
$consumer->consume(1);
foo();