所以,我正在从API请求数据。 到目前为止,我的API密钥仅限于:
每10秒发出10次请求 每10分钟发出500次请求基本上,我想要从用户玩过的每个游戏中请求特定值。 例如,大约有300场比赛。
所以我必须使用PHP发出300个请求。如何减慢速度以观察速率限制? (这可能需要时间,网站不一定要快)
我试过sleep(),这导致我的脚本崩溃..还有其他方法吗?
答案 0 :(得分:0)
我建议设置一个每分钟执行一次的cron作业,甚至更好地使用Laravel调度,而不是使用sleep或usleep来模仿cron。
以下是两者的一些信息:
https://laravel.com/docs/5.1/scheduling
http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/
答案 1 :(得分:0)
这听起来像是set_time_limit()
function的完美用法。此功能允许您指定脚本执行的时间(以秒为单位)。例如,如果您在脚本开头说set_time_limit(45);
,则脚本将运行总共45秒。此功能的一个重要功能是,您可以通过说:set_time_limit(0);
来允许您的脚本无限期地执行(没有时间限制)。
您可能希望使用以下常规结构编写脚本:
<?php
// Ignore user aborts and allow the script
// to run forever
ignore_user_abort(true);
set_time_limit(0);
// Define constant for how much time must pass between batches of connections:
define('TIME_LIMIT', 10); // Seconds between batches of API requests
$tLast = 0;
while( /* Some condition to check if there are still API connections that need to be made */ ){
if( timestamp() <= ($tLast + TIME_LIMIT) ){ // Check if TIME_LIMIT seconds have passed since the last connection batch
// TIME_LIMIT seconds have passed since the last batch of connections
/* Use cURL multi to make 10 asynchronous connections to the API */
// Once all of those connections are made and processed, save the current time:
$tLast = timestamp();
}else{
// TIME_LIMIT seconds have not yet passed
// Calculate the total number of seconds remaining until TIME_LIMIT seconds have passed:
$timeDifference = $tLast + TIME_LIMIT - timestamp();
sleep( $timeDifference ); // Sleep for the calculated number of seconds
}
} // END WHILE-LOOP
/* Do any additional processing, computing, and output */
?>
注意:在此代码段中,我还使用了ignore_user_abort()
function。正如代码注释中所述,此函数只允许脚本忽略用户中止,因此如果用户在脚本仍在执行时关闭浏览器(或连接),脚本将继续检索和处理来自API无论如何。您可能希望在实施中禁用它,但我会将其留给您。
显然这段代码非常不完整,但是它应该让你对如何为这个问题实现解决方案有一个很好的理解。
答案 2 :(得分:-1)
不要减慢个别请求的速度。
相反,您通常会使用类似Redis的内容来跟踪每个IP或每个用户的请求。一旦达到限制一段时间,拒绝(可能使用HTTP 429状态代码),直到计数重置。
http://redis.io/commands/INCR加上http://redis.io/commands/expire很容易就可以了。