Есть четыре инфоблока, у каждого порядка 10-25 свойств, причем элемент первого инфоблока содержит несколько элементов (3-5) второго инфоблока, каждый элемент второго инфоблока содержит 1 элемент 3 инфоблока и 10-20 элементов четвертого инфоблока.
Каждое свойство - элемент справочников.
Свойства получаю следующими двумя фнукциями:
Блоки с ID 51, 52, 53 и 54 как раз и есть эти четыре инфоблока, так вот получается, что на один элемент второго инфоблока приходится порядка 1200-1500 запросов, что занимает около 3 секунд, от сюда при выводе элемента первого инфоблока, где 3-5 элементов второго, 3х5 = 15 секунд или 6000-7500 запросов.
Вопрос: что можно сделать, чтобы оптимизировать число запросов и снизить время обработки? Вариант типа не выводит всю информацию, а раскидать на страницы не прокатывает, клиенту нужно именно все на одной страницы.
Каждое свойство - элемент справочников.
Свойства получаю следующими двумя фнукциями:
Код |
---|
public function getAllPropertys($iBlockID,$ElementID,$count){ $arSelect = Array("ID", "CODE", "NAME", "IBLOCK_ID", "IBLOCK_SECTION_ID", "IBLOCK_CODE", "ACTIVE", "DATE_ACTIVE_FROM", "DATE_ACTIVE_TO", "SORT", "PREVIEW_PICTURE", "PREVIEW_TEXT", "PREVIEW_TEXT_TYPE", "DETAIL_PICTURE", "DETAIL_TEXT", "DETAIL_TEXT_TYPE", "SEARCHABLE_CONTENT", "DATE_CREATE", "LIST_PAGE_URL", "DETAIL_PAGE_URL", "SHOW_COUNTER", "SHOW_COUNTER_START","PROPERTY_*"); $arFilter = Array("IBLOCK_ID"=>$iBlockID, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y","ID"=>$ElementID); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>$count), $arSelect); $i=0; while($ob = $res->GetNextElement()){ $elemnets[$i] = $ob->GetFields(); $tmp_prop = $ob->GetProperties(); foreach ($tmp_prop as $code=>$prop){ if ($prop['LINK_IBLOCK_ID'] == 0){ $elemnets[$i]['PROPERTIES'][$code]=$prop; if ($prop['PROPERTY_TYPE']=='F'){ $elemnets[$i]['PROPERTIES'][$code]['FILE']=CFile::GetByID($elemnets[$i]['PROPERTIES'][$code]['VALUE']); } } else $elemnets[$i]['PROPERTIES'][$code]=$this->getPropertyVal($prop['LINK_IBLOCK_ID'],$prop['VALUE'],$count); } $i++; } return ($elemnets); } public function getPropertyVal($iBlockID,$val,$count){ if ( ($iBlockID==51) OR ($iBlockID==52) OR ($iBlockID==53) OR ($iBlockID==54)){ return $this->getAllPropertys($iBlockID,$val,$count); }else{ if (is_array($val)){ return $this->getAllPropertys($iBlockID,$val,$count); }else{ $res = CIBlockElement::GetByID($val); if($ar_res = $res->GetNext()){ return $ar_res; } else{ return false; } } } } |
Блоки с ID 51, 52, 53 и 54 как раз и есть эти четыре инфоблока, так вот получается, что на один элемент второго инфоблока приходится порядка 1200-1500 запросов, что занимает около 3 секунд, от сюда при выводе элемента первого инфоблока, где 3-5 элементов второго, 3х5 = 15 секунд или 6000-7500 запросов.
Вопрос: что можно сделать, чтобы оптимизировать число запросов и снизить время обработки? Вариант типа не выводит всю информацию, а раскидать на страницы не прокатывает, клиенту нужно именно все на одной страницы.