Pedram Behroozi
Pedram Behroozi

Reputation: 2497

Send Guzzle's "async" request without calling "wait"

I'm trying to send a request to an endpoint, but I don't want to wait for them to respond, as I don't need the response. So I'm using Guzzle, here's how:

$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 I understood, I have to call the wait method on the client in order to actually send the request. But it's totally negates the request being "async" because if the url was not accessible or the server was down, the application would wait for a timeout or any other errors.

So, the question here is, what does Guzzle mean by "async" when you have to wait for the response anyway? And how can I call a truly async request with PHP?

Thanks

Upvotes: 2

Views: 5344

Answers (3)

john graham
john graham

Reputation: 139

use Illuminate\Support\Facades\Http;


...Some Code here

$prom = Http::timeout(1)->async()->post($URL_STRING, $ARRAY_DATA)->wait();

... Some more important code here

return "Request sent"; //OR whatever you need to return

This works for me as I don't need to know the response always. It still uses wait() but because of the small timeout value it doesn't truly wait for the response.

Hope this helps others.

Upvotes: 1

Dror Dromi
Dror Dromi

Reputation: 163

Call then() method if you don't want to wait for the result:

$client = new GuzzleClient();
$promise = $client->getAsync($url)
$promise->then();

Empty then() call will make an HTTP request without waiting for result, Very similar to

curl_setopt(CURLOPT_RETURNTRANSFER,false) 

Upvotes: 3

pr1nc3
pr1nc3

Reputation: 8338

What you can do is:

    $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;

You need the wait() to be called as the last line so you get the result which will come from your promise.

In this case it will return just the status code.

Just as mentioned in Github is not able to "fire and forget"so i think what you are trying to achieve, like a complete promise like in Vue or React won't work for you here the way you want it to work.

Another approach and what i do personally is to use a try-catch on guzzle requests, so if there is a guzzle error then you catch it and throw an exception.

Upvotes: 3

Related Questions