@Us59

Как выполнять ф-цию до момента успешного выполнения?

В ф-ции request выполняется Curl запрос, но иногда он может быть failed из-за Timeout или какой-то другой ошибки, и нужно повторить запрос до успешного выполнения (без ошибок), как это можно сделать?
Как я понимаю делать это в самой ф-ции request через вызов этой же ф-ции не полчится, поскольку дальнейшие действия будут от вызова этой ф-ции (вызывать одно и тоже действие может быть придется 10-20 раз)
spoiler
<?php
class Script {
    private $DB;

    public function __construct($DB_SERVER, $DB_USER, $DB_PASS, $DB_BASE)
    {
        $this->DB = new mysqli($DB_SERVER, $DB_USER, $DB_PASS, $DB_BASE);
    }
    
    function FunctionName ()
    {
        $request = $this->request($_POST["text"]);
    }

    function request ($id)
    {
        $query = $this->GetOrderData();

        if (!empty($query->num_rows)) {
            $ch = curl_init();
            foreach ($query as $value) {
                curl_setopt($ch, CURLOPT_URL, $url);

                $result = curl_exec($ch);

                $arrayResult[] = array(
                    'result' => $result,
                    'Error' => !empty(curl_errno($ch)) ? 1 : 0
                );

                if (curl_errno($ch)) {
                    /*Ошибка Time Out*/
                }

            }
            curl_close($ch);
        }
        return $arrayResult;
    }
}


$object = new Script($DB_SERVER, $DB_USER, $DB_PASS, $DB_BASE);
$request = $object->FunctionName(); // старт идет тут.

if (!empty($request)) {
    foreach ($request as $value) {
        if ($value["Error"] == 0) {
            // Тут проводим дальнейшие действия
        } else {
            // тут нужно как-то повторять действие.
            $this->request($value["Id"]); // если делать это так, то все дальнейшие действия нужно делать с этого момента, а если придется сделать 10 таких запросов...?!
        }
    }
}
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
TommyV888
@TommyV888 Куратор тега PHP
-
Используйте цикл
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
Подобные ограничения справедливы для http запросов, но не для консольных скриптов. Традиционно для этого используют очереди сообщений, например, RabbitMQ. В фоне выполняются задания, а клиента либо регулярно проверяет статус задачи, либо же получает уведомление другим способом (push, email, websocket,...)
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
if (curl_errno($ch)) {
    /*Ошибка Time Out*/
    return false;
}


else {
    // тут нужно как-то повторять действие.
    do {
        $done = $this->request($value["Id"]);
    } while ($done === false);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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