Я достигаю своего предела скорости для 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;}
}
У вас нет $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;}
}
Проблема оказалась в том, что я всегда искал в ключе 7
для строки, говорящей мне мой счетчик попаданий, но иногда он был в другом ключе.