Php 试图一次性提出1500个蒸汽存储请求
我想每天从我的服务器上的steam store中保存大约1500个json文件,但是下面的代码不够好。 正如您在下面看到的,我在保存每个文件后将其设置为睡眠2秒,以避免我的IP被禁止。但我可以看到,它在23分钟内总共下载了447个json文件Php 试图一次性提出1500个蒸汽存储请求,php,file-get-contents,steam-web-api,Php,File Get Contents,Steam Web Api,我想每天从我的服务器上的steam store中保存大约1500个json文件,但是下面的代码不够好。 正如您在下面看到的,我在保存每个文件后将其设置为睡眠2秒,以避免我的IP被禁止。但我可以看到,它在23分钟内总共下载了447个json文件 if(get_http_response_code("https://store.steampowered.com/api/appdetails?appids=".$steamappid) != "200"){ sleep(2);
if(get_http_response_code("https://store.steampowered.com/api/appdetails?appids=".$steamappid) != "200"){
sleep(2);
} else {
sleep(2);
$content = file_get_contents("https://store.steampowered.com/api/appdetails?appids=".$steamappid);
if ($content != "") {
$file = "/home/me/website.com/prices/".$steamappid.".json";
$fr = fopen($file, 'w');
fwrite($fr, $content . "\n");
fclose($fr);
}
}
因此,基本上我想知道我可以做些什么不同的事情来确保它下载其余的文件,使用sleep()
命令来限制执行不是一种可靠的方法。我建议使用一个专门的依赖项来为您处理
我在PHP生态系统方面没有那么丰富的经验,但这正是您所需要的。我在Node.js项目中使用了类似的依赖项
/**
* Throttle to 1500 per *rolling* 24 hours, e.g. the counter will not reset at
* midnight
*/
$throttle = new Stiphle\Throttle\LeakyBucket;
$throttle->throttle('YOUR_STEAM_REQUEST_METHOD', 1500, 86400000);
使用sleep()
命令不是限制执行的可靠方法。我建议使用一个专门的依赖项来为您处理
我在PHP生态系统方面没有那么丰富的经验,但这正是您所需要的。我在Node.js项目中使用了类似的依赖项
/**
* Throttle to 1500 per *rolling* 24 hours, e.g. the counter will not reset at
* midnight
*/
$throttle = new Stiphle\Throttle\LeakyBucket;
$throttle->throttle('YOUR_STEAM_REQUEST_METHOD', 1500, 86400000);
可能有更多的信息(虽然看起来更多的是关于请求的速率,而不是特定的代码修复)。确切的问题是什么?如果你想让它运行得更快,为什么不删除
sleep
calls?@NicoHaase如果我删除sleep calls,那么我担心我可能会因为太快执行太多请求而被禁止(我知道他们每天的请求限制为10k,但不确定每小时或每分钟是否有其他请求)。问题是,目前它停止下载文件后,450个左右的请求,我需要做1500每天那么为什么不做一个适当的队列呢?使用数据库存储所有信息,然后选择一些项目(如一次执行50个),从没有任何数据或最旧的项目开始,更新这些项目,停止整个过程并在几分钟后运行另一次执行可能会有更多的信息(尽管看起来更多的是关于请求的速率,而不是特定的代码修复).确切的问题是什么?如果你想让它运行得更快,为什么不删除sleep
calls?@NicoHaase如果我删除sleep calls,那么我担心我可能会因为太快执行太多请求而被禁止(我知道他们每天的请求限制为10k,但不确定每小时或每分钟是否有其他请求)。问题是,目前它停止下载文件后,450个左右的请求,我需要做1500每天那么为什么不做一个适当的队列呢?使用数据库存储所有信息,然后选择一些项目(如一次执行50项),从没有任何数据或最旧的项目开始,更新这些项目,停止整个过程,几分钟后再运行另一次执行