Як пофіксувати помилку конекту в модулі Elasticsearch for OpenCart

06.11.2022 | Андрій
Помилка конекту в модулі Elasticsearch for OpenCart

Elasticsearch for OpenCart - модуль для індексації даних ваших товарів

Elasticsearch - це дуже крута штука, яка дозволяє оптимізувати пошук у вашому магазині при дуже великих кількостях товарів. Elasticsearch та його можливості будуть розглянуті в іншому пості. Зараз поговорімо про безкоштовний модуль для опенкарт 3, який дозволяє користуватись можливостями Elasticsearch, а саме Elasticsearch for OpenCart

Коротко опишу виникшу ситацію: встановили ми цей модуль, розгорнули еластік на AWS і тут почалось. Айпі адреса в білому списку. Через консоль серверу конектимось без проблем а через модуль отримуємо помилку конекту.

Як пофіксувати помилку конекту в модулі Elasticsearch for OpenCart

Почались танці з бубном в налаштуваннях модулю та, як це не дивно результату 0. Потім почались танці з гуглом, знову результату 0. В кінці кінців довелось йти в контролер модулю і розбиратись в чому проблема. Через дейкий час перебирання файлів модулю та файлів бібліотеки еластік вдалось виявити дивну закономірність: підчас конекту до серверу еластік в параметрах були не відповідні значення, тобто в host - пароль, в schema - port і т.д.

Частина віддладочного логу:



["transfer_stats"]=>
        array(39) {
          ["url"]=>
          string(29) "http://4-cd44ffdaaFC-p8Q:9200/"
          ["content_type"]=>
          NULL
          ["http_code"]=>
          int(0)


Стало зрозуміло наступне - якась функція бібліотеки не вірно генерує параметри підключення. Тепер потрібно знайти цю функцію, благо розбираючи логіку створення поточного конекту вдалось в достатньо короткий час виявити файл і саму функцію, яка робила щось явно не те.



    private function buildConnectionsFromHosts($hosts)
    {
        if (is_array($hosts) === false) {
            $this->logger->error("Hosts parameter must be an array of strings, or an array of Connection hashes.");
            throw new InvalidArgumentException('Hosts parameter must be an array of strings, or an array of Connection hashes.');
        }

        $connections = [];
        foreach ($hosts as $host) {
            if (is_string($host)) {
                $host = $this->prependMissingScheme($host);
                $host = $this->extractURIParts($host);
            } elseif (is_array($host)) {
                $host = $this->normalizeExtendedHost($host);
            } else {
                $this->logger->error("Could not parse host: ".print_r($host, true));
                throw new RuntimeException("Could not parse host: ".print_r($host, true));
            }
            $connections[] = $this->connectionFactory->create($hosts);
        }
	
        return $connections;
    }


В масиві $hosts лежать всі параметри для підключення, які вже підготував модуль для роботи з бібліотекою та функція перебирає кожен параметр і зводить його до вигляду урл-адреси, що і викликає помилку. Рішення проблеми виявилось максимально простим: винести створення конекту $connections за межі циклу з передачею всього массиву $hosts без обробки.



    private function buildConnectionsFromHosts($hosts)
    {
        if (is_array($hosts) === false) {
            $this->logger->error("Hosts parameter must be an array of strings, or an array of Connection hashes.");
            throw new InvalidArgumentException('Hosts parameter must be an array of strings, or an array of Connection hashes.');
        }

        $connections = [];
        foreach ($hosts as $host) {
            if (is_string($host)) {
                $host = $this->prependMissingScheme($host);
                $host = $this->extractURIParts($host);
            } elseif (is_array($host)) {
                $host = $this->normalizeExtendedHost($host);
            } else {
                $this->logger->error("Could not parse host: ".print_r($host, true));
                throw new RuntimeException("Could not parse host: ".print_r($host, true));
            }
           
        }
	    $connections[] = $this->connectionFactory->create($hosts);
        
        return $connections;
    }


Як пофіксувати помилку конекту в модулі Elasticsearch for OpenCart

Сталось те, що мало статись після встановлення модулю. Все запрацювало.
Якщо у вас схожа проблема - спробуйте цей спосіб, файл знаходиться в /system/library/search_plus_7x/vendor/elasticsearch/elasticsearch/src/Elasticsearch/ClientBuilder.php

Бажаєте дізнатись скількі коштує Ваш проєкт?

Заповніть заявку

Категорії

Те, що читають:

Name post

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco

Name post

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco