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 16 17declare(strict_types = 1); 18 19namespace Elasticsearch\ConnectionPool; 20 21use Elasticsearch\Common\Exceptions\NoNodesAvailableException; 22use Elasticsearch\ConnectionPool\Selectors\SelectorInterface; 23use Elasticsearch\Connections\Connection; 24use Elasticsearch\Connections\ConnectionInterface; 25use Elasticsearch\Connections\ConnectionFactoryInterface; 26 27class StaticNoPingConnectionPool extends AbstractConnectionPool implements ConnectionPoolInterface 28{ 29 /** 30 * @var int 31 */ 32 private $pingTimeout = 60; 33 34 /** 35 * @var int 36 */ 37 private $maxPingTimeout = 3600; 38 39 /** 40 * {@inheritdoc} 41 */ 42 public function __construct($connections, SelectorInterface $selector, ConnectionFactoryInterface $factory, $connectionPoolParams) 43 { 44 parent::__construct($connections, $selector, $factory, $connectionPoolParams); 45 } 46 47 public function nextConnection(bool $force = false): ConnectionInterface 48 { 49 $total = count($this->connections); 50 while ($total--) { 51 /** 52 * @var Connection $connection 53*/ 54 $connection = $this->selector->select($this->connections); 55 if ($connection->isAlive() === true) { 56 return $connection; 57 } 58 59 if ($this->readyToRevive($connection) === true) { 60 return $connection; 61 } 62 } 63 64 throw new NoNodesAvailableException("No alive nodes found in your cluster"); 65 } 66 67 public function scheduleCheck(): void 68 { 69 } 70 71 private function readyToRevive(Connection $connection): bool 72 { 73 $timeout = min( 74 $this->pingTimeout * pow(2, $connection->getPingFailures()), 75 $this->maxPingTimeout 76 ); 77 78 if ($connection->getLastPing() + $timeout < time()) { 79 return true; 80 } else { 81 return false; 82 } 83 } 84} 85