您好我尝试从bitfinex JSON获取值。我需要破解脚本90个查询,因为在文档中bitfinex API是信息link:
如果一个IP地址超过每分钟90个请求到REST API,那么 请求IP地址将被阻止10-60秒
<?php
$json = file_get_contents('https://api.bitfinex.com/v1/symbols');
$bitfinex = json_decode($json, true);
$insertBitfinex = $this->code = $this->conn->prepare("INSERT INTO exchange_bitfinex (`first_coin`,`second_coin`,`price`,`volume`,`volume_24`,`time`) VALUES (?,?,?,?,?,?)");
for ($j = 0; $j < count($bitfinex); $j++) {
if($j % 90 == 0 && $j > 0) {
sleep(60);
}
$symbol = $bitfinex[$j];
$json_2 = file_get_contents("https://api.bitfinex.com/v1/pubticker/" . $symbol);
$bitfinex_2 = json_decode($json_2, true);
$first_coin = mb_substr($symbol, 0, 3);
$second_coin = mb_substr($symbol, 3, 6);
$price = $bitfinex_2["last_price"];
$volume_24 = $bitfinex_2["volume"];
$volume = null;
$insertBitfinex = $this->code->bind_param('ssssss', $first_coin, $second_coin, $price, $volume, $volume_24, $time);
$insertBitfinex = $this->code->execute();
$insertBitfinex = $this->code->store_result();
}
我的脚本未正确执行,因为它在90次查询后没有停止。我不知道我是否正确使用模%
答案 0 :(得分:4)
内部循环不使用模运算符权限。即使它执行的次数超过外循环的90次。
但除此之外,这是内循环的问题。
if($i % $limit_query != 0 && $i != $limit_query) {
当循环计数器为例如1时,模运算符也返回一个(非零),因为1/90的余数为1。所以它会在每个周期都睡觉,其中$ i不能平均除以90.
更好的方法是。
if($i % $limit_query == 0 && $i > 0) {
这将等待每个可被90整除的循环但跳过第一个循环。
另一种方法是将api调用90次,然后等待60秒并重复。
while(true) {
//execute the loop for 90 times
for($i=0; $i < 90; $i++) {
//do something
}
//wait for 60 seconds to not exceed api limit
sleep(60);
}
或者如果你必须使用modulo。
$some_big_limit = 10000;
for($i = 0; $i < $some_big_limit; $i++) {
if($i % 90 == 0 && $i > 0) {
//wait for 60 seconds, when the loop counter is evenly divisible by 90
sleep(60);
}
//do something
}