将多用户请求限制为外部站点PHP?

时间:2012-03-21 21:59:24

标签: php api external throttling

我目前有一个脚本,部分地将请求发送到外部站点。使用API​​时,外部站点的API限制为每30秒50个,如果它向主站点发送特定类型的请求(就像我的脚本一样),则每分钟3个。现在,对于使用该脚本的一个用户来说,这很容易解决。但是,多个用户将同时使用该脚本,如果有足够多的用户同时使用该脚本,则限制将会结束。我试图限制多用户请求,以防止我的服务器发送超过限制,即使每个用户不是。我正在试图找到一种方法。确保服务器永远不会向外部站点发送太多请求。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

token bucket algorithm与共享存储配合使用以进行速率限制。我为你实现了一个:bandwidth-throttle/token-bucket

此示例将所有用户的费率限制为每30秒50次请求(即每分钟100次请求):

use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\storage\FileStorage;

$storage = new FileStorage(__DIR__ . "/api.bucket");
$rate    = new Rate(100, Rate::MINUTE);
$bucket  = new TokenBucket(50, $rate, $storage);
$bucket->bootstrap(50);

if (!$bucket->consume(1, $seconds)) {
    http_response_code(429);
    header(sprintf("Retry-After: %d", floor($seconds)));
    exit();
}