31
Авг
2015

Кеширование компонентов в битрикс, если нет настроек

Добрые люди, прошу помощи! Решил поиграться с кешированием компонентов, так как тест производительности показал, что они не кешируются. 50-100 запросов к базе при загрузке страницы...

Погуглив , везде написано, что компонент должен стандартно содержать в себе файлы:

.description.php 
.parameters.php 
component.php (без него якобы работать не будет) 

Полез смотреть у себя (разработчик сайта не я, а фрилансер)

У меня по пути в папке компонента содержится:

Templates 
--.default 
--result_modifier.php 
--template.php 

class.php 

Объясните пожалуйста как мне настроить кеш компонента, если нет обязательных файлов, но оно как то работает? Я так понимаю кеширование как - то тут в файле class.php нужно прописывать? Что-то похожее про кеш записано уже!

Вот код из этого файла

<?php 
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); 
use Bitrix\Highloadblock as HL; 
use Bitrix\Main\Entity; 
use Itbiz\Project; 

class ItBizShowcaseMainMiddleSectionsList extends CBitrixComponent { 
public function executeComponent(){ 
global $USER; 
if ( !CModule::IncludeModule("iblock") ) 
return false; 
if ( !CModule::IncludeModule("highloadblock") ) 
return false; 

$brands = array(); 
$banners = array(); 
$sections = array(); 
$curIblock = (int)$_GET['iblock']; 

$arIblocks = Project\Showcase::getIblockList(); 
if ( $curIblock <= 0 ) 
$curIblock = P_IBLOCK_ID_PRODUCTS; 
elseif ( !array_key_exists($curIblock, $arIblocks) ) 
return; 


// Кэширование... 
$obCache = Project\Cache::getInstance(); 
$cacheParams = array($this->arParams); 
$cacheTag = array( 
'iblock_id_' . $curIblock, 
'region_'.$_SESSION['ITBIZ_USERPLACE']['REGION']['ID'] 
); 
if ( !$obCache->init(__CLASS__.'/sections/', $cacheParams, $cacheTag) ) { 
$rs = CIBlockSection::GetList( 
array( 
'DEPTH_LEVEL' => 'DESC', 
'SORT' => 'ASC', 
'ID' => 'ASC' 
), 
array( 
'ACTIVE' => 'Y', 
'IBLOCK_ID' => $curIblock, 
'<=DEPTH_LEVEL' => 2, 
'!ID'=>3073, 
'!SECTION_ID'=>3073 
), 
true, 
array( 
'ID', 
'IBLOCK_SECTION_ID', 
'NAME', 
'SECTION_PAGE_URL', 
'ELEMENT_CNT', 
'UF_COLOR' 
) 
); 

while ( $rw = $rs->GetNext() ){ 

// Разкомментировать, если нужно 
// выводить секции только содержащие витрины 
// if ( $rw['ELEMENT_CNT'] <= 0 ) 
// continue; 

$tmp = array( 
'id' => $rw['ID'], 
'name' => $rw['NAME'], 
'url' => $rw['SECTION_PAGE_URL'], 
'color' => $rw['UF_COLOR'], 
'items' => array() 
); 

if ( isset($sections[$rw['ID']]) ) { 
$tmp['items'] = $sections[$rw['ID']]; 
unset($sections[$rw['ID']]); 
} 

$sections[(int)$rw['IBLOCK_SECTION_ID']][$rw['ID']] = $tmp; 
} 

$obCache->startDataCache($sections); 
}else{ 
$sections = $obCache->getVars(); 
} 
if ( empty($sections) ) 
return; 
$sections = array_shift($sections); 
//-------------------------------// Получим витрины для разделов...-------------------------------------------------------- 
$hlblock = HL\HighloadBlockTable::getById(19)->fetch(); 
$entityAdv = HL\HighloadBlockTable::compileEntity($hlblock); 
$hlblock = HL\HighloadBlockTable::getById(18)->fetch(); 
$entitySect = HL\HighloadBlockTable::compileEntity($hlblock); 
$arShowcase=array(); 
$propRegion = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$curIblock,"CODE"=>"REGIONS"))->fetch(); 
$propRegion=$propRegion['ID']; 
$propEntity=Project\ElementExTable::compilePropEntity($curIblock); 
foreach(array_keys($sections) as $section){ 
//if ( !$obCache->init(__CLASS__.'/'.$section.'/showcases/', $cacheParams, $cacheTag) ) { 
$query = new \Bitrix\Main\Entity\Query(Project\ElementExTable::getEntity()); 
$query 
->registerRuntimeField("sectprice", array( 
"data_type" => $entitySect->getDataClass(), 
'reference' => array('=this.ID' => 'ref.UF_SHOWCASE'), 
) 
) 
->registerRuntimeField("advdata", array( 
"data_type" => $entityAdv->getDataClass(), 
'reference' => array('=this.ID' => 'ref.UF_SHOWCASE'), 
'join_type' => "INNER" 
) 
) 
->registerRuntimeField("propdata", array( 
"data_type" => $propEntity->getDataClass(), 
'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'), 
'join_type' => "INNER" 
) 
) 
->setSelect(array( 
"ID", 
"NAME", 
'PREVIEW_PICTURE', 
'PREVIEW_TEXT', 
'IBLOCK_SECTION_ID', 
'IBLOCK_ID', 
'advdata.UF_BALANCE' 
)) 
->setFilter(array( 
"WF_STATUS_ID"=>1, 
"ACTIVE"=>"Y", 
"=sectprice.UF_ACTIVE"=>1, 
">advdata.UF_BALANCE"=>0, 
"sectprice.UF_SECTION"=>$section, 
array( 
"LOGIC" => "OR", 
array(">ACTIVE_TO" => date("d-m-Y H:i:s")), 
array("%ACTIVE_TO" => "") 
), 
"propdata.IBLOCK_PROPERTY_ID"=>$propRegion, 
"propdata.VALUE"=>$_SESSION['ITBIZ_USERPLACE']['REGION']['ID'], 
)) 
->setOrder(array("sectprice.UF_PRICE"=>"DESC")) 
->setLimit(4); 

$result = $query->exec(); 
//PR($query->getLastQuery()); 
$result = new \CDBResult($result); 
$showcases=array(); 
while($rw=$result->fetch()){ 
$showcases[]=array( 
'id' => $rw['ID'], 
'name' => $rw['NAME'], 
'url' => $rw['ITBIZ_PROJECT_ELEMENT_EX_advdata_UF_BALANCE']==666666?"/":"/".$rw['IBLOCK_ID']."/".$rw['ID']."/".$rw['IBLOCK_SECTION_ID']."/",
'img' => $rw['PREVIEW_PICTURE'], 
'descr'=> $rw['PREVIEW_TEXT'], 
); 
} 
/*$obCache->startDataCache($showcases); 
}else{ 
$showcases = $obCache->getVars(); 
}*/ 
$sections[$section]['showcase']=$showcases; 
//$arShowcase[$section]=$showcases; 
} 
//PR($arShowcase); 
//-------------------------------// Получим бренды для разделов...-------------------------------------------------------- 

if ( !$obCache->init(__CLASS__.'/elements/', $cacheParams, $cacheTag) ) { 
$rs=CIblockElement::getList(array(),array("IBLOCK_ID"=>$curIblock,"SECTION_ID"=>array_keys($sections),"INCLUDE_SUBSECTIONS"=>"Y","!PROPERTY_BRAND"=>false),array("IBLOCK_SECTION_ID","PROPERTY_BRAND"),false,array("ID","PROPERTY_BRAND","IBLOCK_SECTION_ID"));
$brands=array(); 
$arSectBrands=array(); 
while($rw=$rs->fetch()){ 
$psect=$this->getParentSection($rw['IBLOCK_SECTION_ID'],$sections); 
if($psect>0){ 
if(array_search($rw['PROPERTY_BRAND_VALUE'],$arSectBrands[$psect])===false or !is_array($arSectBrands[$psect])) 
$arSectBrands[$psect][]=$rw['PROPERTY_BRAND_VALUE']; 
$brands = array_merge($brands, array_diff(array($rw['PROPERTY_BRAND_VALUE']), $brands)); 
} 
} 
$rs = Project\BrandsTable::getList(array( 
'filter' => array('UF_XML_ID' => $brands), 
'select' => array( 
'name' => 'UF_NAME', 
'code' => 'UF_XML_ID', 
'img' => 'UF_FILE' 
) 
)); 

$brands = array_flip($brands); 

while ( $rw = $rs->Fetch() ) 
$brands[$rw['code']] = array( 
'name' => $rw['name'], 
'code' => $rw['code'], 
'img' => $rw['img'] 
); 
$obCache->startDataCache(array( 
'sectBrands' => $arSectBrands, 
'brands' => $brands, 
)); 

}else{ 
$tmp = $obCache->getVars(); 
$arSectBrands = $tmp['sectBrands']; 
$brands = $tmp['brands']; 
unset($tmp); 
} 
foreach($arSectBrands as $sect=>$arBrands){ 
$sections[$sect]['brands']=$arBrands; 
} 

// ------------------ Баннеры для разделов -----------------------------------------------// 
$banners=array(); 
foreach (array_keys($sections) as $sectionID){ 
$rs = Project\Banner::getList(array( 
'type_sid' => $curIblock == P_IBLOCK_ID_PRODUCTS?'MAIN_MIDDLE_SECTION':"SECTION_MID_BIG", 
'showcase' => $sectionID, 
'limit'=>1 
),array("CONTRACT"=>"DESC","SHOW_COUNT"=>"ASC","WEIGHT"=>"DESC")); 
foreach ( $rs as $v ) { 
$banners[$v['fields']['SHOWCASE']] = array( 
'html' => $v['html'] 
); 
} 
} 

$this->arResult = array( 
'brands' => $brands, 
'banners' => $banners, 
'sections' => $sections 
); 
$this->includeComponentTemplate(); 
} 
private function getParentSection($sectionID,$sections){ 
if(!array_key_exists($sectionID,$sections)){ 
foreach($sections as $key=>$sectArr){ 
if(array_key_exists($sectionID,$sectArr['items'])){ 
return $key; 
} 

} 
return false; 
}else{ 
return $sectionID; 
} 
} 
}

Где включить кеширование в настройках компонента я знаю, а вот если нет таких настроек то где прописать в коде и что прописать что бы кеширование заработало?

Источник: https://ru.stackoverflow.com/questions/446180/%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%BE%D0%B2-%D0%B2-%D0%B1%D0%B8%D1%82%D1%80%D0%B8%D0%BA%D1%81-%D0%B5%D1%81%D0%BB%D0%B8-%D0%BD%D0%B5%D1%82-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BA

Share

Тебе может это понравится...