deadloop
@deadloop
Активно осваиваю PHP

Как правильно делать запросы в цикле?

У меня есть контроллер, в котором осуществляется запрос к внешнему API. Необходимо выполнить 4 запроса. Они выполняются в цикле foreach, после каждого запроса стоит пауза в 5 секунд. Однако я не уверен, что это правильное решение. Какие способы могли бы улучшить данный функционал?

foreach ($cityList as $cityName => $coordinates) {
        $cityData[$cityName] = getCityDataFromApiService($cityName, $coordinates['latitude'], $coordinates['longitude']);
        sleep(5);
    }
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
it depends

  • если запросы зависимые, то в цикле
  • если запросы можно выполнить "параллельно", то можно асинхронно сделать сразу все 4 запроса и подождать самый медленный


например через multi curl, тогда все 4 запроса будут выполняться за время самого медленного из них, а не за сумму времени, удобно через Guzzle Async

$promise1 = $client->getAsync('http://www.example.com/foo1');
$promise2 = $client->getAsync('http://www.example.com/foo2');
$promise3 = $client->getAsync('http://www.example.com/foo3');
$promises = [$promise1, $promise2, $promise3];

$results = GuzzleHttp\Promise\settle($promises)->wait(); // тут все результаты


в обоих случаях не понятно, зачем таймаут, тк синхронно второй запрос начнется только ПОСЛЕ выполнения предыдущего, а в асинхронном варианте они просто выполнятся "одновременно" и вы получите результат сразу от всех запросов... таймаут ни к селу ни к городу
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы