Magento 2.3 очень медленный с более чем 100 строками - PullRequest
0 голосов
/ 12 июля 2019

Я работаю в установке Magento 2.3 со средним размером корзины 100-150 строк.Получение видимых элементов корзины из Цитаты происходит медленнее (по мере увеличения количества продуктов)

Я искал в ядре Magento и обнаружил, что задержка вызывается, когда он пытается получить Цитату из базы данных.(?)

in $ quote = $ this-> quoteRepository-> getActive ($ this-> getQuoteId ());

public function getQuote()
{
    $this->_eventManager->dispatch('custom_quote_process', ['checkout_session' => $this]);

    if ($this->_quote === null) {
        $quote = $this->quoteFactory->create();
        if ($this->getQuoteId()) {
            try {
                if ($this->_loadInactive) {
                    $quote = $this->quoteRepository->get($this->getQuoteId());
                } else {
                    $quote = $this->quoteRepository->getActive($this->getQuoteId());
                }

                /**
                 * If current currency code of quote is not equal current currency code of store,
                 * need recalculate totals of quote. It is possible if customer use currency switcher or
                 * store switcher.
                 */
                if ($quote->getQuoteCurrencyCode() != $this->_storeManager->getStore()->getCurrentCurrencyCode()) {
                    $quote->setStore($this->_storeManager->getStore());
                    $this->quoteRepository->save($quote->collectTotals());
                    /*
                     * We mast to create new quote object, because collectTotals()
                     * can to create links with other objects.
                     */
                    $quote = $this->quoteRepository->get($this->getQuoteId());
                }
            } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
                $this->setQuoteId(null);
            }
        }

        if (!$this->getQuoteId()) {
            if ($this->_customerSession->isLoggedIn() || $this->_customer) {
                $customerId = $this->_customer
                    ? $this->_customer->getId()
                    : $this->_customerSession->getCustomerId();
                try {
                    $quote = $this->quoteRepository->getActiveForCustomer($customerId);
                    $this->setQuoteId($quote->getId());
                } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
                }
            } else {
                $quote->setIsCheckoutCart(true);
                $this->_eventManager->dispatch('checkout_quote_init', ['quote' => $quote]);
            }
        }

        if ($this->_customer) {
            $quote->setCustomer($this->_customer);
        } elseif ($this->_customerSession->isLoggedIn()) {
            $quote->setCustomer($this->customerRepository->getById($this->_customerSession->getCustomerId()));
        }

        $quote->setStore($this->_storeManager->getStore());
        $this->_quote = $quote;
    }

    if (!$this->isQuoteMasked() && !$this->_customerSession->isLoggedIn() && $this->getQuoteId()) {
        $quoteId = $this->getQuoteId();
        /** @var $quoteIdMask \Magento\Quote\Model\QuoteIdMask */
        $quoteIdMask = $this->quoteIdMaskFactory->create()->load($quoteId, 'quote_id');
        if ($quoteIdMask->getMaskedId() === null) {
            $quoteIdMask->setQuoteId($quoteId)->save();
        }
        $this->setIsQuoteMasked(true);
    }

    $remoteAddress = $this->_remoteAddress->getRemoteAddress();
    if ($remoteAddress) {
        $this->_quote->setRemoteIp($remoteAddress);
        $xForwardIp = $this->request->getServer('HTTP_X_FORWARDED_FOR');
        $this->_quote->setXForwardedFor($xForwardIp);
    }

    return $this->_quote;
}

Задержка включенав среднем около 15-25 секунд.Есть ли способ хранить такие данные в кеширующем хранилище, таком как Redis?Я уже установил Redis в качестве кеша хранения без удачи.

Кто-нибудь еще сталкивался с такой проблемой?Magento Changelog утверждает, что тележки должны быть в порядке, если в них содержится около 300 строк

https://devdocs.magento.com/guides/v2.2/release-notes/ReleaseNotes2.2.0CE.html

Проект работает на выделенном сервере с 32 ГБ ОЗУ и 8 ядрами XEON Cpu

ОБНОВЛЕНИЕ

После еще одного расследования я обнаружил, что задержка в строке Quote.php 1380-1391

public function getItemsCollection($useCache = false)
{
    if ($this->hasItemsCollection()) {
        return $this->getData('items_collection');
    }
    if (null === $this->_items) {
        $this->_items = $this->_quoteItemCollectionFactory->create();
        $this->extensionAttributesJoinProcessor->process($this->_items);
        $this->_items->setQuote($this);
    }
    return $this->_items;
}

Странно то, что нет '• Не запрашивает ли трафик на мониторе Redis CLI при запросе этой коллекции данные такого типа в Redis?

ОБНОВЛЕНИЕ 2

Кажется, что "плагин "или что-то около функции getItemsCollection.Я остановил выполнение в нем, и ответ был немедленным, если я позволю, он возвращает $ this-> items, показывает задержку.Пытался использовать xdebug для того, чтобы найти причину задержки без удачи.Xdebug следовал за выполнением до Collection.php, где я потерял трек.Профилировщик Mysql показал около 1500 запросов, запущенных на странице корзины (я думаю, это огромное количество), хотя ни один из них не длился дольше, чем ~ 5 мс (там, где около 15 мс).

Итак, я установил новый magentoустановка с использованием темы luna и импортирование примеров продуктов с использованием composer.Новый vm имеет MySql 5.7, PHP-FPM 7.2 и redis.Включен производственный режим, все кэши, кроме page_cache, и установка повторного кэша по умолчанию. Добавлено 46 элементов в корзину, и результат только для загрузки документа составил ~ 13 с

enter image description here

Я не могу смириться с тем, что Magento не может справиться с таким размером тележки.Это время не приемлемо для конечных пользователей.

Не знаю, с чего начать поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...