Ограничение / ограничение скорости при переполнении стека

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

Есть ли более простой способ ограничения скорости (я вызываю функцию) без использования каких-либо библиотек, кроме использования 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

Решение

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

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

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

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

0

Другие решения

Вам также понадобится общее состояние между вашими процессами, чтобы разделить скорость. Я предлагаю использовать мою библиотеку: пропускная способность дроссель / лексема-ковш

$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();
1

По вопросам рекламы [email protected]