Мы продолжаем наполнять каталог. Сейчас у нас всего 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 мегабайт.
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев