Отправьте «асинхронный» запрос Guzzle без вызова «wait» - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь отправить запрос в конечную точку, но я не хочу ждать, пока они ответят, так как мне не нужен ответ. Итак, я использую Guzzle, вот как:

$url = 'http://example.com';

$client = new \Guzzelhttp\Client();
$promise = $client->postAsync($url, [
    'headers' => ['Some headers and authorization'],
    'query' => [
        'params' => 'params',
    ]
])->then(function ($result) {
    // I don't need the result. So I just leave it here.
});

$promise->wait();

A Я понял, что для вызова запроса мне нужно вызвать wait метод client. Но это полностью сводит на нет запрос, являющийся «асинхронным», потому что, если URL-адрес не был доступен или сервер не работал, приложение будет ожидать тайм-аут или любых других ошибок.

Итак, вопрос здесь в том, что Гудзл подразумевает под "асинхронностью", когда вам все равно приходится ждать ответа? И как я могу вызвать действительно асинхронный запрос с PHP?

Спасибо

1 Ответ

0 голосов
/ 15 мая 2019

Что вы можете сделать, это:

    $url = 'http://example.com';

    $client = new \Guzzelhttp\Client();
    $promise = $client->postAsync($url, [
        'headers' => ['Some headers and authorization'],
        'query' => [
            'params' => 'params',
        ]
    ])->then(function ($result) {
         return $result->getStatusCode();
    })
->wait();

echo $promise;

Вам нужно назвать wait() последней строкой, чтобы получить результат, который будет получен из вашего обещания.

В этом случае он вернет только код состояния.

Так же, как упомянуто в Github, он не может «выстрелить и забыть», поэтому я думаю, что вы пытаетесь достичь, например, полное обещание, как в Vue или React, не сработает для вас так, как вы хотите, чтобы оно работало .

Другой подход, который я использую лично, - это использование try-catch в запросах на жадность, поэтому, если возникает ошибка жрета, вы перехватываете ее и генерируете исключение.

...