Я использую 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;
}
}
Перебирайте список запросов, но в каждом цикле получите метку времени Unix (отсчитывает в секундах) и отправляйте запрос только в том случае, если отметка времени выше, чем в последний раз, когда вы отправляли запрос, а затем запишите метку времени для проверки в следующем цикле.
Если ваша цель — убедиться, что вы не отправляете больше, чем раз в секунду, но не хотите затягивать секунды, тогда цикл, вероятно, лучше, чем если:
foreach ($array as $value) {
$timestamp = time();
while ($timestamp == time()) {
continue;
}
doYourThing();
}
таким образом, сценарий будет циклически проходить по вашему списку, но для каждого элемента в списке он будет продолжать вращаться по циклу while до тех пор, пока второй не остановится, когда он выполнит вашу команду и перейдет прямо к следующему элементу.
Вам также понадобится общее состояние между вашими процессами, чтобы разделить скорость. Я предлагаю использовать мою библиотеку: пропускная способность дроссель / лексема-ковш
$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();