Задать вопрос
@aopil

Как повторить запросы через 5 секунд если вернулся Null?

Проблема в том, что я могу дать ф-ции массив из 100 заказов и она отработает нормально, но иногда может вернуть NULL (т.е. сам url возвращает нам NULL из-за того, что мы делаем много запросов насколько я понимаю).
Цель ф-ции: 20-30 запросах в минуту.
Как можно проверять, что вернулся NULL и повторять через 5 секунд запросы на которые вернулось NULL?
spoiler
function Request ($data)
    {
        $url = "http://URL";

        $multi = curl_multi_init();
        $orders = [];

        foreach ($data as $value)
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_TIMEOUT, 50); // нужно указывать проверку если вернулся false, то возвращать статус.
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_multi_add_handle($multi, $ch);
            $orders[] = array(
                'url' => $ch,
                'Id' => $value
            );
        }

        $active = null;
        do {
            $mrc = curl_multi_exec($multi, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);


        while ($active && $mrc == CURLM_OK) {
            if (curl_multi_select($multi) == -1) {
                usleep(10000);    
                // continue; 
            }

            do {
                $mrc = curl_multi_exec($multi, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        }

        foreach ($orders as $order)
        {
            $result = json_decode(curl_multi_getcontent($order["url"]), true);
            if (!empty($result)) {
                    // результат не пустой и я делаю записи в БД
            }

            curl_multi_remove_handle($multi, $order["url"]);
        }
        curl_multi_close($multi);
    }


Я думаю конечно можно сделать что-то типа:
if (empty($result)) {
                    $array[] = $order["Id"];
            }
....
return $array;

и потом вызывать ф-цию снова, но может есть лучшие варианты сделать это в самой ф-ции?)
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
Minifets
@Minifets
Hello world!!!
Я бы такой функционал реализовывал на event loop от reactphp.

Пример простого таймера.
Выполняете функцию, которая делает запрос. В случае если она возвращает null, то вешаете отложенный таймер с повторным вызовом.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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