[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Кеширование компонента в битрикс
Evg82
Добрые люди, прошу помощи! Решил поиграться с кешированием компонентов, так как тест производительности показал что они не кешируются. 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;
}
}
}




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

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.