我使用各种第三方Web API,其中许多都强制限速。如果有一个相当普通的PHP库,我可以用它来限制我的调用,这将是非常有用的。我可以想出几种方法来做到这一点,也许可以将呼叫放入队列中,并且可以打电话的时间戳,但是如果其他人已经做得很好,我希望避免重新发明车轮。PHP限速客户端
PHP限速客户端
回答
我不能拿信誉,但我使用这种方法,因为没有'通用'软件包 - 但我想你可以根据你的编码方法做到这一点。
这看起来是服务器端,我如何扼杀其他人对我的API的使用 - 最终有用,不要误会我 - 但我需要将自己的呼叫限制到其他人的服务器。 (除非你指的是代码片段,看起来它可能是客户端,实际上这可能接近我的需要。) – 2010-11-25 04:17:18
作为替代,我(过去)创建的存储API调用,所以如果我尝试再次进行相同的调用,在特定的时间范围内的“缓存”的文件夹,它首先从缓存中抓取(更加无缝),直到可以拨打新电话。可能会在短期内收到归档信息,但可以帮助您避免API长期阻挡您。
缓存只有在我使用相同参数调用给定的API时才有用。这是朝着正确方向迈出的一步,但我会经常变化参数并期待不同的结果。另外,一些API禁止在其TOS中进行缓存。 – 2010-11-25 04:15:08
我意识到这是一个古老的线程,但认为我会发布我的解决方案,因为它基于我在SE上发现的其他东西。我花了一段时间寻找自己的答案,但很难找到一些好的东西。它基于here讨论的Python解决方案,但我添加了对可变大小请求的支持,并使用PHP闭包将其转换为函数生成器。
function ratelimiter($rate = 5, $per = 8) {
$last_check = microtime(True);
$allowance = $rate;
return function ($consumed = 1) use (
&$last_check,
&$allowance,
$rate,
$per
) {
$current = microtime(True);
$time_passed = $current - $last_check;
$last_check = $current;
$allowance += $time_passed * ($rate/$per);
if ($allowance > $rate)
$allowance = $rate;
if ($allowance < $consumed) {
$duration = ($consumed - $allowance) * ($per/$rate);
$last_check += $duration;
usleep($duration * 1000000);
$allowance = 0;
}
else
$allowance -= $consumed;
return;
};
}
它可以用来限制任何东西。下面是在每8秒的默认五“请求”限制了简单的声明一个愚蠢的例子:
$ratelimit = ratelimiter();
while (True) {
$ratelimit();
echo "foo".PHP_EOL;
}
下面是我使用它在基于每600秒600个请求限制对Facebook的图形API批处理请求在批次的大小:
$ratelimit = ratelimiter(600, 600);
while (..) {
..
$ratelimit(count($requests));
$response = (new FacebookRequest(
$session, 'POST', '/', ['batch' => json_encode($requests)]
))->execute();
foreach ($response->..) {
..
}
}
希望这可以帮助别人!
您可以使用token bucket algorithm进行速率限制。我在PHP中实现了这个功能:bandwidth-throttle/token-bucket :
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();
}
- 1. Laravel限制客户端下载速度
- 2. Facebook API速率限制 - 服务器端vs客户端
- 3. Facebook API速率限制 - 服务器端或客户端更好?
- 4. PHP查询速度慢但客户端速度很快
- 5. PHP SOAP客户端
- 6. PHP/FTP客户端
- 7. 客户端无限循环
- 8. 权限与UNET客户端
- 9. Unity UNet客户端权限
- 10. Perforce客户端权限
- 11. Socket.IO服务器限制快速客户端
- 12. 限速检测使用流的Java API客户端
- 13. php聊天客户端
- 14. solr php客户端刻面
- 15. PHP SOAP客户端到WCF
- 16. 运行PHP客户端
- 17. Solr PHP客户端vs file_get_contents?
- 18. PHP邮件客户端库
- 19. PHP中的WebSocket客户端?
- 20. WSDL客户端问题,PHP
- 21. php memcache客户端性能
- 22. PHP邮件客户端
- 23. Google api php客户端
- 24. 需要快速的.NET FTP客户端
- 25. 客户端HTML高速缓存
- 26. 非高速缓存DNS客户端
- 27. PHP验证客户端签名使用客户端公钥
- 28. JavaScript(或JS + PHP)终端客户端
- 29. 谷歌API客户端的PHP - MKDIR():权限被拒绝
- 30. PHP - mongodb客户端 - 跳过并限制使用
限制API调用或字节传输的数量? – stillstanding 2010-11-23 15:37:14
API调用次数。 – 2010-11-25 04:13:39