Почему функция работает не корректно?

Апи сайта, при обращении к нему (get запрос) возвращает данные. Если 1 запрос - всё нормально.
Если много запросов подряд (10-15), то приблизительно с 15 запроса данные уже не приходят.
А через минуту всё снова работает.
Сайт регулирует нагрузку, кол-во запросов с одного айпи в течении времени.

Мне же нужно выполнить много запросов. Для этого я написал функцию.

set_time_limit(1200); //20 минут на выполнение скрипта

$data=get_exec_guaranteed('api.site.ru',180,20); //Вызов функции

//Функция
function get_exec_guaranteed($url,$execution_time,$pause_time)
{
$response='error'; //По умолчанию возвращаем слово error т.е. ошибка.
$response_time=time()+$execution_time; //Время, когда цикл остановится, вне зависимости от результата.
//Используем в цикле usleep (время в микросекундах) т.к. sleep в циклах не работает
do {$data=file_get_contents($url); if (!$data) {usleep($pause_time*1000000);} } while (!$data and $response_time>time());
if ($data) $response=$data;
return $response; //Вернем или данные или ошибку
}


Но функция не корректно работает.
При первом отказе Warning: file_get_contents...failed to open stream: HTTP request failed! HTTP/1.1 429 Too Many Requests in... Не идут дальнейшие попытки получения данных. Выводит сразу error. Т.е. попробовал получить данные один раз и всё (выход из цикла?).
А дальше цикл работает. Идут 4 ошибки подряд Warning: file_get_contents...failed to open stream и данные снова приходят. Уже пробует получить данные много раз (не выходит из цикла?).

Итого на 70 запросов, нет данных в 16 и 58 запросе. Т.к. в этих запросах была всего 1 попытка получить данные.
А должно быть минимум 9 (180/20=9 проходов цикла).

Т.е. вывод как то так
data=1
data=2
data=3
Warning: file_get_contents //вот он 1 отказ сайта т.к. выше было куча запросов
data=error //т.е. была всего 1 попытка?
Warning: file_get_contents //а сейчас видно, что работает цикл
Warning: file_get_contents
Warning: file_get_contents
Warning: file_get_contents
data=5 //снова идут данные т.к. прошло 4*20=80 секунд и сайт снова выдает мне информацию
data=6
data=7
Warning: file_get_contents
data=error
Warning: file_get_contents
Warning: file_get_contents
Warning: file_get_contents
Warning: file_get_contents
data=9
data=10

Почему функция работает не корректно? (Подозреваю ошибку в логике.)
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Программа делает не то, что хочет программист, а то, что он в ней написал. У вас нигде не написано, что цикл должен непременно выполниться пять раз. Если при запросе file_get_contents ответ вернётся через 2:40 или позднее, то цикл выполниться всего один раз.
И научитесь код оформлять, что-ли. Прочтите PSR-2, поставьте phpcs.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы