Я работаю в установке 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 с
Я не могу смириться с тем, что Magento не может справиться с таким размером тележки.Это время не приемлемо для конечных пользователей.
Не знаю, с чего начать поиск.