Обработка тайм-аутов Guzzle с помощью асинхронных обещаний

Я отправляю несколько асинхронных обещаний с тайм-аутом, установленным на 30, мне интересно, как зафиксировать время ожидания каких-либо обещаний, чтобы я мог сообщить об этой ошибке. Пожалуйста, смотрите код ниже. По сути, я хочу использовать любые ответы, которые я могу, до тайм-аута и захватить те, которые делают тайм-аут.

foreach ($apiRequests as $guzzleParameters) {
    $request = new Request($guzzleParameters->getType(), $guzzleParameters->getApiEndpoint(), $guzzleParameters->getHeaders(), $guzzleParameters->getBody());
    $promises[$guzzleParameters->createKey()] = $this->client->sendAsync($request)->then(
                function (ResponseInterface $res) {
                    return $res;
                },
                function (RequestException $e) {
                    switch ($e->getCode()) {
                        case 400:
                        // log error 
                            break;
                        case 401:
                        // log error 
                            break;
                        case 403:
                        // log error 
                            break;
                        case 404:
                        // log error 
                            break;
                    }
                    return $e->getResponse();
                }
            );
        }
$responses = Promise\Utils::settle($promises)->wait(true);

person pilotman    schedule 24.03.2021    source источник
comment
попытайтесь получить ответ об исключении только тогда, когда он у вас есть, вы используете requestException, поэтому, если у него будет ответ, только вы можете получить код, который сломается в случае статуса 503 или любого другого статуса 50X, см. Обработка исключений в пуле запросов   -  person bhucho    schedule 25.03.2021
comment
также как вы проверяете тайм-аут, я не вижу его в приведенном выше коде, вы говорите, что установили тайм-аут жрать на 30, это для каждого запроса или для пула запросов, также покажите, что в $guzzleParameters->getHeaders()   -  person bhucho    schedule 25.03.2021
comment
Привет, время ожидания установлено следующим образом: $client = new Client([ 'timeout' => 30 ]); in, заголовки пусты, а тело пусто (это повторно используемый компонент, но в моем случае заголовки и тело не нужны. Только API и префикс. 30 для пула. Я не уверен, как определить, если тайм-аут обещаний и как это проверить   -  person pilotman    schedule 25.03.2021
comment
используйте параметр запроса on_stats при отправке запроса и регистрации все данные или использовать getTransferTime(), предоставленные экземпляром onstats, должен ли я поделиться примером?   -  person bhucho    schedule 25.03.2021
comment
Пример был бы отличным спасибо   -  person pilotman    schedule 25.03.2021


Ответы (1)


Как я понял, вы хотите записать время каждого запроса в асинхронном режиме, а затем вы можете сложить его и поставить флаг, когда сумма достигает более 30.

ПРИМЕЧАНИЕ. Непроверенный код, но проверен код части on_stats.

foreach ($apiRequests as $key => $guzzleParameters) {
    $LogStats = [];
    $request = new Request($guzzleParameters->getType(), $guzzleParameters->getApiEndpoint(), $guzzleParameters->getHeaders(), $guzzleParameters->getBody());
    $promises[$guzzleParameters->createKey()] = $this->client->sendAsync($request, [
                    'on_stats' => function (\GuzzleHttp\TransferStats $stats) {
                        // $LogStats["uri"] = $stats->getEffectiveUri();
                        $LogStats[$key]["time"] = $stats->getTransferTime();
                        // $LogStats["stats"] = json_encode($stats->getHandlerStats());
                        // Log::debug("\n--------------------------------\nDebug Solr Request Stats :: ", $LogStats);
                    }
                ])->then(
                function (ResponseInterface $res) {
                    return $res;
                },
                function (RequestException $e) {
                     // ....
                    }
                    return $e->getResponse();
                }
            );
        }
$responses = Promise\Utils::settle($promises)->wait(true);

Здесь я использовал on_stats, вы можете поставить считайте все время, а затем суммируйте его, и как только он достигнет 30, установите флаг как истинный. тогда вы можете узнать, после какого ключа запрос не удался.

person bhucho    schedule 26.03.2021
comment
вы можете установить переменную $debug как true в методе для запуска on_stats только в режиме отладки, также это всего лишь одна из идей, которая поможет решить вашу проблему. - person bhucho; 26.03.2021