Оптимизация загрузки SKU в списке

Artem добавил(а) 2 года назад
Решена

Здравствуйте. Со времен BXREADY на нашем сайте существовала следующая проблема:

Наш каталог построен на основе торговых предложений. Почти все товары имеют SKU. И каждое SKU имеет как минимум одно свойство с картинкой - это нужно чтобы можно было отобрать предложение в списке. Сам каталог состоит из 7000шт товаров. SKU - 17000шт и у каждого по свойству.

В ходе тестирования вашего продукта выяснилось, что при включении функционала sku и если свойство для отбора отображается в виде изображения, то почти любая страница со списком товара, грузится более 10сек в нашем случае.

Обнаружил что в шаблоне компонента catalog.section в файле result_modifier.php используется метод:

$arNeedValues = array();
CIBlockPriceTools::getTreePropertyValues($arSKUPropList, $arNeedValues);
Первый параметр - массив свойств для отбора SKU. Например "цвет". Во втором параметре - массив значений этих свойств. Второй параметр пустой! И метод получает структуру ВСЕХ значений! И если у нас SKU 7000шт и у каждого своё свойство "цвет" со своим уникальным значением, то создаётся 14 ТЫСЯЧ ДОПОЛНИТЕЛЬНЫХ ЗАПРОСОВ В БД, результат которых, на мой взгляд нигде не используется при выводе товара. Но у меня на странице выводится всего 20-40 sku и картинки для них. Зачем мне информация об оставшихся 6960 изображений?????? С моим каталогом Выполнение этого кода занимает около 10 секунд!!

Но благо для себя я нашёл решение. И делюсь им с другими обладателями продукта АСПРО МАКСИМУМ. Может кому поможет

Возможно я где-то ошибаюсь, но вроде всё работает корректно:

$arNeedValues = array();
// Балуша ниже
foreach ($arResult["ITEMS"] as $item) {
	foreach ($item["OFFERS"] as $offer) {
		foreach ($offer["DISPLAY_PROPERTIES"] as $prop) {
			if (in_array($prop['CODE'], $arParams['OFFER_TREE_PROPS'])) {
				if ($prop["PROPERTY_TYPE"] == "L"){
					if ($prop["VALUE_ENUM_ID"]) $arNeedValues[$prop["ID"]][] = $prop["VALUE_ENUM_ID"];
				} else {
					if ($prop["VALUE"]) $arNeedValues[$prop["ID"]][] = $prop["VALUE"];
				}
			}
		}
	}
}
// Балуша выше
CIBlockPriceTools::getTreePropertyValues($arSKUPropList, $arNeedValues);

Ответы (4)

фото
3

было:

7c9297b9982473c3a6d029d2273000b1


Стало:55ee80df7cc077383581be8ae98540b2

фото
2

Важная поправка к коду: Нужна проверка на наличие второго параметра. Если в разделе только простые товары, то снова загрузка на 20 сек.

if ($arNeedValues) {
	CIBlockPriceTools::getTreePropertyValues($arSKUPropList, $arNeedValues);
}

фото
фото
1

Очень хотелось бы услышать комментарий от разработчиков Аспро.

фото
1

Справедливости ради, оригинальное сообщение было опубликовано в четыре часа вечера субботы, комментариев от команды Аспро раньше начала рабочей недели ждать не стоит.

фото
1

Так я же не мгновенный ответ прошу конечно же. А, чтобы это вопрос протестировали и дали развернутый ответ. Это актуально для проектов с большим количеством SKU.

У нас например у клиента — более 160 000 позиций.

фото
3

Очень крутой лайвхак по ускорялке, вот здесь виднл в цифрах как было как стало, что говорит о нормальном понимании оптимизации, дай бог увидить это в решении

фото
фото
3

Здравствуйте. Благодарим вас за обратную связь. Зарегистрировали задачу под номером MAX-3287. Рассмотрим ваш вариант реализации. Продуктивной вам недели!

фото
2

Ребята красавцы! Спасибо большое, что уже в работе! Реально необходимая вещь в проектах с большим количеством SKU!

Комментировать
 
Прикрепить файлы