#php #curl #throttling
#php #curl #регулирование
Вопрос:
Я работаю над проектом, использующим api, моя подписка позволяет мне выполнять 2 запроса в секунду.
Этот API позволяет находить слова, которые связаны с другим словом.
Мой проект заключается в рекурсивном использовании этого API. слово A выдает слово B и C, слова B и C каждое дают по 2 слова и т.д., рекурсивно, с ограничением, которое указывает пользователь.
Я сохраняю каждое слово в объекте «word». В __конструкции этого объекта я вызываю функцию, которая вызывает этот API и которая преобразует каждый результат в новый объект.
Все работает, единственная проблема заключается в том, что когда указанный уровень рекурсивности слишком высок, API ничего не возвращает, хотя у меня есть таймер на 0,5 секунды.
Итак, я настроил цикл. Пока ответ на мой запрос cURL не равен 200, я повторяю его с таймером в 0,5 секунды.
$a = 200;
$httpcode = 0;
while ($httpcode !== $a) {
$postRequest = [
'content' => $this->getMot(),
'lang' => 'fr',
'limit' => $this->getLimite(),
'key' => "//////////////////////"
];
$cURLConnection = curl_init('https://api.keywords.gg/entities');
curl_setopt($cURLConnection, CURLOPT_HTTPHEADER,
['Content-Type: application/json']);
curl_setopt($cURLConnection, CURLOPT_POSTFIELDS, json_encode($postRequest));
curl_setopt($cURLConnection, CURLOPT_RETURNTRANSFER, true);
$apiResponse = curl_exec($cURLConnection);
$httpcode = curl_getinfo($cURLConnection, CURLINFO_HTTP_CODE);
$apiResponse = curl_exec($cURLConnection);
curl_close($cURLConnection);
}
Я думаю, что мой метод регулирования неверен. Не могли бы вы дать мне несколько советов?
Комментарии:
1. Разместите здесь свой фактический код, а не картинку вашего кода.
2. Изображения кода плохо влияют на доступность, плохо подходят для поиска и делают невозможным копирование вашего кода для его запуска, чтобы найти какие-либо ошибки.
Ответ №1:
Как вы можете видеть в документации sleep, он ожидает целое число.
Вы отправляете плавающее число 0.6, затем преобразуете его в целое значение 0.
Таким образом, ваш вызов sleep становится:
sleep(0)
Вам нужно использовать usleep (int микросекунд), если вам нужна большая точность.
usleep(600)