src/Service/RetryClientFactory.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use GuzzleHttp\HandlerStack;
  4. use GuzzleHttp\Handler\CurlHandler;
  5. use GuzzleHttp\Middleware;
  6. use GuzzleHttp\Psr7\Request;
  7. use GuzzleHttp\Psr7\Response;
  8. use GuzzleHttp\Exception\RequestException;
  9. use GuzzleHttp\Exception\ConnectException;
  10. use GuzzleHttp\Client;
  11. use GuzzleHttp\Exception\GuzzleException;
  12. class RetryClientFactory
  13. {
  14. public static function buildClient($cfg)
  15. {
  16. $handlerStack = HandlerStack::create(new CurlHandler());
  17. $handlerStack->push(Middleware::retry('App\Service\RetryClientFactory::decider', 'App\Service\RetryClientFactory::delay'));
  18. $cfg['handler'] = $handlerStack;
  19. return new Client($cfg);
  20. }
  21. public static function decider($retries, Request $request, Response $response = null, GuzzleException $exception = null)
  22. {
  23. // Limit the number of retries to 5
  24. if ($retries >= 5) {
  25. return false;
  26. }
  27. // Retry connection exceptions
  28. if ($exception instanceof ConnectException) {
  29. return true;
  30. }
  31. if ($response) {
  32. // Retry on server errors
  33. if ($response->getStatusCode() >= 500) {
  34. return true;
  35. }
  36. }
  37. return false;
  38. }
  39. public static function delay($numberOfRetries)
  40. {
  41. return 1000 * $numberOfRetries;
  42. }
  43. }