2015-02-25 2 views
0

Я использую API рекламы продукта Amazon, который имеет ограничение 1 query per second. Я нашел это library, который, кажется, делает то, что я хочу, но его немного переполняю для моего требования.Ограничение скорости/ограничение скорости в PHP

Есть ли более простой способ ограничения скорости (я вызываю функцию) без использования каких-либо библиотек, кроме того, используя sleep, потому что он будет спать за 1 second и количество запросов, которые мне нужно сделать, я должен сохранять каждую секунду.

$array = range(1,100); 

foreach ($array as $value) { 
    $timestamp = time(); 
    if ($timestamp != time()) { 
     echo "\n value: ".$value." ".$timestamp; 
    } else { 
     usleep(1000000); 
     echo "\n value: ".$value." ".$timestamp; 
    } 
} 
+0

Что насчет usleep? – lelloman

ответ

0

Loop через свой список запросов, но на каждом цикле получить метку времени (отсчитывает в секундах) и только отправить запрос, если временная отметка выше, чем в прошлый раз, когда вы послали запрос, а затем записать метку времени для проверки в следующем цикле.

Если ваша цель состоит в том, чтобы убедиться, что вы не посылать больше, что один раз в секунду, но вы не хотите талией секунд затем цикл probaly лучше, чем если так:

foreach ($array as $value) { 
    $timestamp = time(); 
    while ($timestamp == time()) { 
    continue; 
    } 
    doYourThing(); 
} 

так сценарий будет проходить через ваш список, но для каждого элемента в списке он будет продолжать вращаться через цикл while до тех пор, пока второй не будет отменен, когда он выполнит вашу команду и перейдет прямо в ваш следующий элемент.

+0

бит трудно форматировать код в поле комментариев, поэтому я добавлю к своему ответу – Horaland

1

Для совместного использования курса вам также потребуется совместное использование между вашими процессами. Я предлагаю использовать свою библиотеку: bandwidth-throttle/token-bucket

$storage = new FileStorage(__DIR__ . "/api.bucket"); 
$rate  = new Rate(1, Rate::SECOND); 
$bucket = new TokenBucket(1, $rate, $storage); 
$consumer = new BlockingConsumer(bucket); 
$bucket->bootstrap(1); 

// This will block all your processes to an effective rate of 1/s 
$consumer->consume(1); 

echo $productApi->doSomething(); 
Смежные вопросы