Использование sleep (), чтобы избежать ограничения скорости не работает

Я достигаю своего предела скорости для API, который я использую, и я сбит с толку, потому что метод, который я использовал для предотвращения этого, похоже, должен определенно работать, но он не работает 100% времени. У меня есть эта строка перед каждым вызовом API, который должен вызывать функцию, которая проверяет, близок ли я к своему пределу, и если я, то сплю достаточно долго, чтобы сбросить счетчик посещений. Как это:

if (isset($http_response_header)) {rateLimit($http_response_header);}
file_get_contents($endpointURL);

Вот функция:

function rateLimit($header)
{
// get hit count from $header

// $count[0] is how many hits per second
// I have a limit of 20 per second

// $count[1] is how many hits per 2 minutes
// I have a limit of 100 per 2 minutes

if ($count[0] == 19) {sleep(1); return;}
if ($count[1] == 99) {sleep(120); return;}
}

Он должен спать 1 секунду, если я сделал максимальное количество вызовов в секунду, и спать две минуты, если я сделал максимальное количество вызовов в 2 минуты. Что-то не так с моим кодом, или что-то не так с API, неправильно меня ограничивающим?

Вот весь rateLimit функция, так как кто-то хотел знать, как я ее анализирую:

function rateLimit($header)
{
$pos1 = strpos($header[7], ' ') + 1;
$pos2 = strpos($header[7], ':', $pos1);
$count[0] = substr($header[7], $pos1, ($pos2 - $pos1));

$pos1 = strpos($header[7], ',') + 1;
$pos2 = strpos($header[7], ':', $pos1);
$count[1] = substr($header[7], $pos1, ($pos2 - $pos1));

if ($count[0] == 18) {sleep(1); return;}
if ($count[1] == 98) {sleep(120); return;}
}

0

Решение

У вас нет $count определяется как массив в вашем rateLimit функция, так что вы, вероятно, получаете предупреждение о неопределенном индексе, и это нарушает ваш код.

Так что либо делай это

function rateLimit($header)
{
$count = [];

$pos1 = strpos($header[7], ' ') + 1;
$pos2 = strpos($header[7], ':', $pos1);
$count[0] = substr($header[7], $pos1, ($pos2 - $pos1));

$pos1 = strpos($header[7], ',') + 1;
$pos2 = strpos($header[7], ':', $pos1);
$count[1] = substr($header[7], $pos1, ($pos2 - $pos1));

if ($count[0] == 18) {sleep(1); return;}
if ($count[1] == 98) {sleep(120); return;}
}

или это

function rateLimit($header)
{
$pos1 = strpos($header[7], ' ') + 1;
$pos2 = strpos($header[7], ':', $pos1);

$pos1 = strpos($header[7], ',') + 1;
$pos2 = strpos($header[7], ':', $pos1);

if (substr($header[7], $pos1, ($pos2 - $pos1)) == 18) {sleep(1); return;}
if (substr($header[7], $pos1, ($pos2 - $pos1)) == 98) {sleep(120); return;}
}
0

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

Проблема оказалась в том, что я всегда искал в ключе 7 для строки, говорящей мне мой счетчик попаданий, но иногда он был в другом ключе.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector