vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php line 110

Open in your IDE?
  1. <?php
  2. /**
  3.  * Elasticsearch PHP client
  4.  *
  5.  * @link      https://github.com/elastic/elasticsearch-php/
  6.  * @copyright Copyright (c) Elasticsearch B.V (https://www.elastic.co)
  7.  * @license   http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  8.  * @license   https://www.gnu.org/licenses/lgpl-2.1.html GNU Lesser General Public License, Version 2.1
  9.  *
  10.  * Licensed to Elasticsearch B.V under one or more agreements.
  11.  * Elasticsearch B.V licenses this file to you under the Apache 2.0 License or
  12.  * the GNU Lesser General Public License, Version 2.1, at your option.
  13.  * See the LICENSE file in the project root for more information.
  14.  */
  15. declare(strict_types 1);
  16. namespace Elasticsearch;
  17. use Elasticsearch\Common\Exceptions;
  18. use Elasticsearch\ConnectionPool\AbstractConnectionPool;
  19. use Elasticsearch\Connections\Connection;
  20. use Elasticsearch\Connections\ConnectionInterface;
  21. use GuzzleHttp\Ring\Future\FutureArrayInterface;
  22. use Psr\Log\LoggerInterface;
  23. class Transport
  24. {
  25.     /**
  26.      * @var AbstractConnectionPool
  27.      */
  28.     public $connectionPool;
  29.     /**
  30.      * @var LoggerInterface
  31.      */
  32.     private $log;
  33.     /**
  34.      * @var int
  35.      */
  36.     public $retryAttempts 0;
  37.     /**
  38.      * @var Connection
  39.      */
  40.     public $lastConnection;
  41.     /**
  42.      * @var int
  43.      */
  44.     public $retries;
  45.     /**
  46.      * Transport class is responsible for dispatching requests to the
  47.      * underlying cluster connections
  48.      *
  49.      * @param int                                   $retries
  50.      * @param bool                                  $sniffOnStart
  51.      * @param ConnectionPool\AbstractConnectionPool $connectionPool
  52.      * @param \Psr\Log\LoggerInterface              $log            Monolog logger object
  53.      */
  54.     public function __construct(int $retriesAbstractConnectionPool $connectionPoolLoggerInterface $logbool $sniffOnStart false)
  55.     {
  56.         $this->log            $log;
  57.         $this->connectionPool $connectionPool;
  58.         $this->retries        $retries;
  59.         if ($sniffOnStart === true) {
  60.             $this->log->notice('Sniff on Start.');
  61.             $this->connectionPool->scheduleCheck();
  62.         }
  63.     }
  64.     /**
  65.      * Returns a single connection from the connection pool
  66.      * Potentially performs a sniffing step before returning
  67.      */
  68.     public function getConnection(): ConnectionInterface
  69.     {
  70.         return $this->connectionPool->nextConnection();
  71.     }
  72.     /**
  73.      * Perform a request to the Cluster
  74.      *
  75.      * @param string $method  HTTP method to use
  76.      * @param string $uri     HTTP URI to send request to
  77.      * @param array  $params  Optional query parameters
  78.      * @param null   $body    Optional query body
  79.      * @param array  $options
  80.      *
  81.      * @throws Common\Exceptions\NoNodesAvailableException|\Exception
  82.      */
  83.     public function performRequest(string $methodstring $uri, array $params = [], $body null, array $options = []): FutureArrayInterface
  84.     {
  85.         try {
  86.             $connection  $this->getConnection();
  87.         } catch (Exceptions\NoNodesAvailableException $exception) {
  88.             $this->log->critical('No alive nodes found in cluster');
  89.             throw $exception;
  90.         }
  91.         $response             = [];
  92.         $caughtException      null;
  93.         $this->lastConnection $connection;
  94.         $future $connection->performRequest(
  95.             $method,
  96.             $uri,
  97.             $params,
  98.             $body,
  99.             $options,
  100.             $this
  101.         );
  102.         
  103.         $future->promise()->then(
  104.             //onSuccess
  105.             function ($response) {
  106.                 $this->retryAttempts 0;
  107.                 // Note, this could be a 4xx or 5xx error
  108.             },
  109.             //onFailure
  110.             function ($response) {
  111.                 $code $response->getCode();
  112.                 // Ignore 400 level errors, as that means the server responded just fine
  113.                 if ($code 400 || $code >= 500) {
  114.                     // Otherwise schedule a check
  115.                     $this->connectionPool->scheduleCheck();
  116.                 }
  117.             }
  118.         );
  119.         return $future;
  120.     }
  121.     /**
  122.      * @param FutureArrayInterface $result  Response of a request (promise)
  123.      * @param array                $options Options for transport
  124.      *
  125.      * @return callable|array
  126.      */
  127.     public function resultOrFuture(FutureArrayInterface $result, array $options = [])
  128.     {
  129.         $response null;
  130.         $async = isset($options['client']['future']) ? $options['client']['future'] : null;
  131.         if (is_null($async) || $async === false) {
  132.             do {
  133.                 $result $result->wait();
  134.             } while ($result instanceof FutureArrayInterface);
  135.         }
  136.         return $result;
  137.     }
  138.     public function shouldRetry(array $request): bool
  139.     {
  140.         if ($this->retryAttempts $this->retries) {
  141.             $this->retryAttempts += 1;
  142.             return true;
  143.         }
  144.         return false;
  145.     }
  146.     /**
  147.      * Returns the last used connection so that it may be inspected.  Mainly
  148.      * for debugging/testing purposes.
  149.      */
  150.     public function getLastConnection(): ConnectionInterface
  151.     {
  152.         return $this->lastConnection;
  153.     }
  154. }