$config */ public static function make(array $config): Client { $hosts = self::buildHosts($config['hosts'] ?? []); if ($hosts === []) { throw new RuntimeException('No Elasticsearch hosts configured'); } $builder = ClientBuilder::create() ->setHosts($hosts) ->setRetries((int) ($config['retries'] ?? 2)); $builder->setHttpClient(new GuzzleClient(self::buildHttpClientOptions($config))); return $builder->build(); } /** * @param array|string> $configHosts * @return list */ public static function buildHosts(array $configHosts): array { $hosts = []; foreach ($configHosts as $host) { if (is_string($host) && trim($host) !== '') { $hosts[] = $host; continue; } if (! is_array($host)) { continue; } $hostname = trim((string) ($host['host'] ?? '')); if ($hostname === '') { continue; } $scheme = trim((string) ($host['scheme'] ?? 'http')) ?: 'http'; $port = $host['port'] ?? null; $portSuffix = $port !== null && $port !== '' ? ':'.(string) $port : ''; $credentials = ''; if (! empty($host['user']) && ! empty($host['pass'])) { $credentials = rawurlencode((string) $host['user']).':'.rawurlencode((string) $host['pass']).'@'; } $hosts[] = sprintf('%s://%s%s%s', $scheme, $credentials, $hostname, $portSuffix); } return $hosts; } /** * @param array $config * @return array */ public static function buildHttpClientOptions(array $config): array { $options = []; $timeout = $config['timeout'] ?? null; if (is_numeric($timeout) && (float) $timeout > 0) { $options['timeout'] = (float) $timeout; } $connectTimeout = $config['connect_timeout'] ?? null; if (is_numeric($connectTimeout) && (float) $connectTimeout > 0) { $options['connect_timeout'] = (float) $connectTimeout; } return $options; } }