レート制限にトークン バケット アルゴリズムを使用できます。私はあなたのためにそれを実装しました: bandwidth-throttle/token-bucket
サーバーのリソースをブロックするため、スリープしないこともお勧めします。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();