С производительностью умного фильтра разобрались, теперь разберемся с расходом памяти.
Мы продолжаем наполнять каталог. Сейчас у нас всего 2000 свойств в инфоблоке. В одном из разделов 4000 товаров. Эти товары используют всего 10 свойств для умного фильтра. Но страница перестала открываться с ошибкой, что мало памяти.
Сначала было
@ini_set( "memory_limit", "512M" );
Я увеличил
@ini_set( "memory_limit", "1024M" );
На какое-то время хватило. Но скоро опять перестало открываться. Кто съел гигабайт? Этот код:
Функция CIBlockElement::GetPropertyValues выбирает все значения свойств, в том числе и для пустых. Значения пустых свойств false.
У нас получилось в массиве $arElements 4000 элементов по 2000 свойств в каждом. Всего на гигабайт в оперативной памяти.
Пришлось исправить. В $arNewElement попадают только те свойства, которые есть в умном фильтре и непустые.
Теперь вместо гигабайта массив $arElements занимает около 20 мегабайт.
Мы продолжаем наполнять каталог. Сейчас у нас всего 2000 свойств в инфоблоке. В одном из разделов 4000 товаров. Эти товары используют всего 10 свойств для умного фильтра. Но страница перестала открываться с ошибкой, что мало памяти.
Сначала было
@ini_set( "memory_limit", "512M" );
Я увеличил
@ini_set( "memory_limit", "1024M" );
На какое-то время хватило. Но скоро опять перестало открываться. Кто съел гигабайт? Этот код:
$arElementFilter = array( "IBLOCK_ID" => $this->IBLOCK_ID, "SUBSECTION" => $this->SECTION_ID, "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y", ); $arElements = array(); $rsElements = CIBlockElement::GetPropertyValues($this->IBLOCK_ID, $arElementFilter); while($arElement = $rsElements->Fetch()) $arElements[$arElement["IBLOCK_ELEMENT_ID"]] = $arElement; |
Функция CIBlockElement::GetPropertyValues выбирает все значения свойств, в том числе и для пустых. Значения пустых свойств false.
У нас получилось в массиве $arElements 4000 элементов по 2000 свойств в каждом. Всего на гигабайт в оперативной памяти.
Пришлось исправить. В $arNewElement попадают только те свойства, которые есть в умном фильтре и непустые.
$arElementFilter = array( "IBLOCK_ID" => $this->IBLOCK_ID, "SUBSECTION" => $this->SECTION_ID, "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y", ); $arElements = array(); $rsElements = CIBlockElement::GetPropertyValues($this->IBLOCK_ID, $arElementFilter); while($arElement = $rsElements->Fetch()) { $arNewElement = array(); foreach ( $arResult["ITEMS"] as $key => $arItem ) { if ( isset($arElement[$key]) && $arElement[$key] !== false ) { $arNewElement[ $key ] = $arElement[$key]; } } $arElements[$arElement["IBLOCK_ELEMENT_ID"]] = $arNewElement; unset($arElement); } |
Теперь вместо гигабайта массив $arElements занимает около 20 мегабайт.