Добрые люди, прошу помощи! Решил поиграться с кешированием компонентов, так как тест производительности показал что они не кешируются. 50-100 запросов к базе при загрузке страницы... Погуглив , везде написано, что компонент должен стандартно содержать в себе файлы: .description.php .parameters.php component.php (без него якобы работать не будет) Полез смотреть у себя (разработчик сайта не я, а фрилансер) у меня по пути в папке компонента содержится: Templates -.default -- result_modifier.php --template.php class.php Объясните пожалуйста как мне настроить кеш компонента, если нет обязательных файлов, но оно как то работает? Я так понимаю кеширование как - то тут в файле class.php нужно прописывать? Что то похожее про кеш записано уже! Вот код из этого файла Код (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; } } } Где включить кеширование в настройках компонента я знаю, а вот если нет таких настроек то где прописать в коде и что прописать что бы кеширование заработало? PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Очень мало информации, её не достаточно чтобы помочь. Очень сложное задание для помощи на форуме, когда хочешь чтобы всё сделали за тебя, а не просто подсказку. Можно подождать кто хорошо знаком с Bitrix и он подскажет, ещё можно документацию по нему посмотреть. Возможно есть форум по Bitrix и там люди которые с ним каждый день работают, смогу тебе помочь. Могу перенести тему в раздел "free-lance" или "сделайте за меня".