I have jobs that run on multiple queue workers, that contain some HTTP requests using Guzzle. However, the try-catch block inside this job does not seem to pick up
GuzzleHttp\Exception\RequestException when I am running these job in the background process. The running process is a
php artisan queue:work which is a Laravel queue system worker that monitors the queue and picks up the jobs.
Instead, the exception that is thrown is one of
GuzzleHttp\Promise\RejectionException with the message:
The promise was rejected with reason: cURL error 28: Operation timed out after 30001 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
This is actually a disguised
GuzzleHttp\Exception\ConnectException (see https://github.com/guzzle/promises/blob/master/src/RejectionException.php#L22), because if I run a similar job in a regular PHP process that is triggered by visiting an URL, I do get the
ConnectException as intended with the message:
cURL error 28: Operation timed out after 100 milliseconds with 0 out of 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
Sample code that would trigger this timeout:
$c = new \GuzzleHttp\Client([ 'timeout' => 0.1 ]); $response = (string) $c->get('https://example.com')->getBody();
So basically what I derive, is that this
RejectionException is wrapping the message from the
ConnectException, however I am not using the asynchronous features of Guzzle. My requests are simply done in series. The only thing that differs is that multiple PHP processes might be making Guzzle HTTP calls or that the jobs itself are timing out (which should result in a different exception being Laravel’s
Illuminate\Queue\MaxAttemptsExceededException), but I dont see how this causes the code to behave differently.
I couldnt find any code inside the Guzzle packages that is using
PHP_SAPI (which determines the used interface) to execute different stuff when running from the CLI as opposed to a browser trigger.
Why does Guzzle throw me
RejectionExceptions on my worker processes, but
ConnectExceptions on regular PHP scripts triggered through browser?