PHP中断了60秒脚本,每90次查询

时间:2018-04-12 11:14:19

标签: php

您好我尝试从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次查询后没有停止。我不知道我是否正确使用模%

来解决问题

1 个答案:

答案 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
}