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

E2
На сайте с 31.07.2011
Offline
57
3802

Добрые люди, прошу помощи! Решил поиграться с кешированием компонентов, так как тест производительности показал что они не кешируются. 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://clck.ru/ETx2D)
alexvaleev
На сайте с 04.02.2010
Offline
55
#1

Кэширование в вашем компоненте реализовано не стандартными средствами (хотя очень похоже), а через обертку в классе Itbiz\Project\Cache, которую, вероятно, написал фрилансер.

Самый простой вариант - спросить что и как должно работать у него.

Блог (http://alexvaleev.ru) Всем роуп! (https://rujump.ru/)
E2
На сайте с 31.07.2011
Offline
57
#2
alexvaleev:
Кэширование в вашем компоненте реализовано не стандартными средствами (хотя очень похоже), а через обертку в классе Itbiz\Project\Cache, которую, вероятно, написал фрилансер.
Самый простой вариант - спросить что и как должно работать у него.

Потеряна с ним связь...

Подскажите мне вот такое возможно реализовать в файле class.php? http://dev.1c-bitrix.ru/api_help/main/reference/cphpcache/index.php

alexvaleev
На сайте с 04.02.2010
Offline
55
#3
EVG82:
Потеряна с ним связь...

Подскажите мне вот такое возможно реализовать в файле class.php? http://dev.1c-bitrix.ru/api_help/main/reference/cphpcache/index.php

Реализовать можно, но в компоненте уже есть кэширование и по-хорошему сначала нужно удалить его. К тому же, возможно у программиста была веская причина использовать нестандартное решение и писать свой класс-обертку.

E2
На сайте с 31.07.2011
Offline
57
#4
alexvaleev:
Реализовать можно, но в компоненте уже есть кэширование и по-хорошему сначала нужно удалить его. К тому же, возможно у программиста была веская причина использовать нестандартное решение и писать свой класс-обертку.

Да в компоненте есть кеширование и попытки что то подставить как напсиано в мануале приводят к фаталу или синтаксич ошибкам.

А кеширование как таковое работает. в режиме отладки при сбросе кеша запросов в базу 157, после того как стр еще раз загружаю запросов 33, но все равно это много.

Как определить где находиться эта самая обертка? Может там чего можно сделать чтобы кеширование еще лучше работало? Что запросов к базе на втором хите было в 3 раза меньше

alexvaleev
На сайте с 04.02.2010
Offline
55
#5

Класс Itbiz\Project\Cache. В компоненте подключения файла не видно, поэтому скорее всего:

1. в /bitrix/php_interface/init.php

2. на странице вызова компонента

E2
На сайте с 31.07.2011
Offline
57
#6
alexvaleev:
Класс Itbiz\Project\Cache. В компоненте подключения файла не видно, поэтому скорее всего:
1. в /bitrix/php_interface/init.php
2. на странице вызова компонента

Становится интересно...

Открыл файл init.php и тут вижу похожее на создание кеширования что в мануале

Вот часть кода где поиском ноутпад++ нашел слово cache


$cache_id = md5(serialize(array('IBLOCK_ID'=>$data['IBLOCK_ID'])));
$cache_dir = "/cache/tagged_getlist";

$obCache = new CPHPCache;
if($obCache->InitCache(36000, $cache_id, $cache_dir)){
$data['IBLOCK_DATA'] = $obCache->GetVars();
} elseif(CModule::IncludeModule("iblock") && $obCache->StartDataCache()) {
global $CACHE_MANAGER;
$data['IBLOCK_DATA']=CIBlock::GetByID($data['IBLOCK_ID'])->GetNext();
$CACHE_MANAGER->StartTagCache($cache_dir);

$CACHE_MANAGER->RegisterTag("iblock_id_".$data['IBLOCK_DATA']["ID"]);


$CACHE_MANAGER->EndTagCache();
$obCache->EndDataCache($data['IBLOCK_DATA']);
}

$moderatorsGroups = array(7);

$cache_id = md5(serialize(array('GET_USERS_FROM_GROUP'=>$moderatorsGroups)));
$cache_dir = "/cache/tagged_getlist";
$obCache = new CPHPCache;
if($obCache->InitCache(/*3600*/0, $cache_id, $cache_dir)){
$data['moderators'] = $obCache->GetVars();
} elseif( $obCache->StartDataCache()) {
global $CACHE_MANAGER;
$arUsers = array();
foreach ($moderatorsGroups as $groupID) {
if(intval($groupID)>0){
$groupUsers = CGroup::GetGroupUser(intval($groupID));
if(!empty($groupUsers))
$arUsers = array_merge($arUsers,$groupUsers);
}
}

/*$data['moderators']=array('pai@vertical-soft.com');*/
if(!empty($arUsers)){
$rsUsers = CUser::GetList(($by="id"), ($order="asc"), array('ID' => implode('|', $arUsers)));
while($arUser=$rsUsers->GetNext()){
if(!in_array($arUser['EMAIL'],$data['moderators']))
$data['moderators'][] = $arUser['EMAIL'];

$CACHE_MANAGER->RegisterTag("user_".$arUser["ID"]);
}
}

$CACHE_MANAGER->EndTagCache();
$obCache->EndDataCache($data['moderators']);

Я правильно понимаю, что вот эта часть кода связана с файлом class.php моего компонента?

и вот такие строки кода


$obCache = new CPHPCache;
if($obCache->InitCache(36000, $cache_id, $cache_dir)){
$data***91;'IBLOCK_DATA'***93; = $obCache->GetVars();
} elseif(CModule::IncludeModule("iblock") && $obCache->StartDataCache()) {

еще далее встречаются.

Похоже на то что здесь реализована та самая обертка?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий