За последние 24 часа нас посетили 17404 программиста и 1277 роботов. Сейчас ищут 1437 программистов ...

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

Тема в разделе "Вопросы от блондинок", создана пользователем Evg82, 31 авг 2015.

  1. Evg82

    Evg82 Активный пользователь

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

    Погуглив , везде написано, что компонент должен стандартно содержать в себе файлы:
    .description.php
    .parameters.php
    component.php (без него якобы работать не будет)
    Полез смотреть у себя (разработчик сайта не я, а фрилансер)

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

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

    class.php

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

    Код (PHP):
    1. <?php 
    2. if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); 
    3. use Bitrix\Highloadblock as HL; 
    4. use Bitrix\Main\Entity; 
    5. use Itbiz\Project; 
    6.  
    7. class ItBizShowcaseMainMiddleSectionsList extends CBitrixComponent { 
    8. public function executeComponent(){ 
    9. global $USER; 
    10. if ( !CModule::IncludeModule("iblock") ) 
    11. return false; 
    12. if ( !CModule::IncludeModule("highloadblock") ) 
    13. return false; 
    14.  
    15. $brands = array(); 
    16. $banners = array(); 
    17. $sections = array(); 
    18. $curIblock = (int)$_GET['iblock']; 
    19.  
    20. $arIblocks = Project\Showcase::getIblockList(); 
    21. if ( $curIblock <= 0 ) 
    22. $curIblock = P_IBLOCK_ID_PRODUCTS; 
    23. elseif ( !array_key_exists($curIblock, $arIblocks) ) 
    24. return; 
    25.  
    26.  
    27. // Кэширование... 
    28. $obCache = Project\Cache::getInstance(); 
    29. $cacheParams = array($this->arParams); 
    30. $cacheTag = array( 
    31. 'iblock_id_' . $curIblock, 
    32. 'region_'.$_SESSION['ITBIZ_USERPLACE']['REGION']['ID'] 
    33. ); 
    34. if ( !$obCache->init(__CLASS__.'/sections/', $cacheParams, $cacheTag) ) { 
    35. $rs = CIBlockSection::GetList( 
    36. 'DEPTH_LEVEL' => 'DESC', 
    37. 'SORT' => 'ASC', 
    38. 'ID' => 'ASC' 
    39. ), 
    40. 'ACTIVE' => 'Y', 
    41. 'IBLOCK_ID' => $curIblock, 
    42. '<=DEPTH_LEVEL' => 2, 
    43. '!ID'=>3073, 
    44. '!SECTION_ID'=>3073 
    45. ), 
    46. true, 
    47. 'ID', 
    48. 'IBLOCK_SECTION_ID', 
    49. 'NAME', 
    50. 'SECTION_PAGE_URL', 
    51. 'ELEMENT_CNT', 
    52. 'UF_COLOR' 
    53. ) 
    54. ); 
    55.  
    56. while ( $rw = $rs->GetNext() ){ 
    57.  
    58. // Разкомментировать, если нужно 
    59. // выводить секции только содержащие витрины 
    60. // if ( $rw['ELEMENT_CNT'] <= 0 ) 
    61. // continue; 
    62.  
    63. $tmp = array( 
    64. 'id' => $rw['ID'], 
    65. 'name' => $rw['NAME'], 
    66. 'url' => $rw['SECTION_PAGE_URL'], 
    67. 'color' => $rw['UF_COLOR'], 
    68. 'items' => array() 
    69. ); 
    70.  
    71. if ( isset($sections[$rw['ID']]) ) { 
    72. $tmp['items'] = $sections[$rw['ID']]; 
    73. unset($sections[$rw['ID']]); 
    74. } 
    75.  
    76. $sections[(int)$rw['IBLOCK_SECTION_ID']][$rw['ID']] = $tmp; 
    77. } 
    78.  
    79. $obCache->startDataCache($sections); 
    80. }else{ 
    81. $sections = $obCache->getVars(); 
    82. } 
    83. if ( empty($sections) ) 
    84. return; 
    85. $sections = array_shift($sections); 
    86. //-------------------------------// Получим витрины для разделов...-------------------------------------------------------- 
    87. $hlblock = HL\HighloadBlockTable::getById(19)->fetch(); 
    88. $entityAdv = HL\HighloadBlockTable::compileEntity($hlblock); 
    89. $hlblock = HL\HighloadBlockTable::getById(18)->fetch(); 
    90. $entitySect = HL\HighloadBlockTable::compileEntity($hlblock); 
    91. $arShowcase=array(); 
    92. $propRegion = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$curIblock,"CODE"=>"REGIONS"))->fetch(); 
    93. $propRegion=$propRegion['ID']; 
    94. $propEntity=Project\ElementExTable::compilePropEntity($curIblock); 
    95. foreach(array_keys($sections) as $section){ 
    96. //if ( !$obCache->init(__CLASS__.'/'.$section.'/showcases/', $cacheParams, $cacheTag) ) { 
    97. $query = new \Bitrix\Main\Entity\Query(Project\ElementExTable::getEntity()); 
    98. $query 
    99. ->registerRuntimeField("sectprice", array( 
    100. "data_type" => $entitySect->getDataClass(), 
    101. 'reference' => array('=this.ID' => 'ref.UF_SHOWCASE'), 
    102. ) 
    103. ) 
    104. ->registerRuntimeField("advdata", array( 
    105. "data_type" => $entityAdv->getDataClass(), 
    106. 'reference' => array('=this.ID' => 'ref.UF_SHOWCASE'), 
    107. 'join_type' => "INNER" 
    108. ) 
    109. ) 
    110. ->registerRuntimeField("propdata", array( 
    111. "data_type" => $propEntity->getDataClass(), 
    112. 'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'), 
    113. 'join_type' => "INNER" 
    114. ) 
    115. ) 
    116. ->setSelect(array( 
    117. "ID", 
    118. "NAME", 
    119. 'PREVIEW_PICTURE', 
    120. 'PREVIEW_TEXT', 
    121. 'IBLOCK_SECTION_ID', 
    122. 'IBLOCK_ID', 
    123. 'advdata.UF_BALANCE' 
    124. )) 
    125. ->setFilter(array( 
    126. "WF_STATUS_ID"=>1, 
    127. "ACTIVE"=>"Y", 
    128. "=sectprice.UF_ACTIVE"=>1, 
    129. ">advdata.UF_BALANCE"=>0, 
    130. "sectprice.UF_SECTION"=>$section, 
    131. "LOGIC" => "OR", 
    132. array(">ACTIVE_TO" => date("d-m-Y H:i:s")), 
    133. array("%ACTIVE_TO" => "") 
    134. ), 
    135. "propdata.IBLOCK_PROPERTY_ID"=>$propRegion, 
    136. "propdata.VALUE"=>$_SESSION['ITBIZ_USERPLACE']['REGION']['ID'], 
    137. )) 
    138. ->setOrder(array("sectprice.UF_PRICE"=>"DESC")) 
    139. ->setLimit(4); 
    140.  
    141. $result = $query->exec(); 
    142. //PR($query->getLastQuery()); 
    143. $result = new \CDBResult($result); 
    144. $showcases=array(); 
    145. while($rw=$result->fetch()){ 
    146. $showcases[]=array( 
    147. 'id' => $rw['ID'], 
    148. 'name' => $rw['NAME'], 
    149. 'url' => $rw['ITBIZ_PROJECT_ELEMENT_EX_advdata_UF_BALANCE']==666666?"/":"/".$rw['IBLOCK_ID']."/".$rw['ID']."/".$rw['IBLOCK_SECTION_ID']."/",
    150. 'img' => $rw['PREVIEW_PICTURE'], 
    151. 'descr'=> $rw['PREVIEW_TEXT'], 
    152. ); 
    153. } 
    154. /*$obCache->startDataCache($showcases); 
    155. }else{ 
    156. $showcases = $obCache->getVars(); 
    157. }*/ 
    158. $sections[$section]['showcase']=$showcases; 
    159. //$arShowcase[$section]=$showcases; 
    160. } 
    161. //PR($arShowcase); 
    162. //-------------------------------// Получим бренды для разделов...-------------------------------------------------------- 
    163.  
    164. if ( !$obCache->init(__CLASS__.'/elements/', $cacheParams, $cacheTag) ) { 
    165. $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"));
    166. $brands=array(); 
    167. $arSectBrands=array(); 
    168. while($rw=$rs->fetch()){ 
    169. $psect=$this->getParentSection($rw['IBLOCK_SECTION_ID'],$sections); 
    170. if($psect>0){ 
    171. if(array_search($rw['PROPERTY_BRAND_VALUE'],$arSectBrands[$psect])===false or !is_array($arSectBrands[$psect])) 
    172. $arSectBrands[$psect][]=$rw['PROPERTY_BRAND_VALUE']; 
    173. $brands = array_merge($brands, array_diff(array($rw['PROPERTY_BRAND_VALUE']), $brands)); 
    174. } 
    175. } 
    176. $rs = Project\BrandsTable::getList(array( 
    177. 'filter' => array('UF_XML_ID' => $brands), 
    178. 'select' => array( 
    179. 'name' => 'UF_NAME', 
    180. 'code' => 'UF_XML_ID', 
    181. 'img' => 'UF_FILE' 
    182. ) 
    183. )); 
    184.  
    185. $brands = array_flip($brands); 
    186.  
    187. while ( $rw = $rs->Fetch() ) 
    188. $brands[$rw['code']] = array( 
    189. 'name' => $rw['name'], 
    190. 'code' => $rw['code'], 
    191. 'img' => $rw['img'] 
    192. ); 
    193. $obCache->startDataCache(array( 
    194. 'sectBrands' => $arSectBrands, 
    195. 'brands' => $brands, 
    196. )); 
    197.  
    198. }else{ 
    199. $tmp = $obCache->getVars(); 
    200. $arSectBrands = $tmp['sectBrands']; 
    201. $brands = $tmp['brands']; 
    202. unset($tmp); 
    203. } 
    204. foreach($arSectBrands as $sect=>$arBrands){ 
    205. $sections[$sect]['brands']=$arBrands; 
    206. } 
    207.  
    208. // ------------------ Баннеры для разделов -----------------------------------------------// 
    209. $banners=array(); 
    210. foreach (array_keys($sections) as $sectionID){ 
    211. $rs = Project\Banner::getList(array( 
    212. 'type_sid' => $curIblock == P_IBLOCK_ID_PRODUCTS?'MAIN_MIDDLE_SECTION':"SECTION_MID_BIG", 
    213. 'showcase' => $sectionID, 
    214. 'limit'=>1 
    215. ),array("CONTRACT"=>"DESC","SHOW_COUNT"=>"ASC","WEIGHT"=>"DESC")); 
    216. foreach ( $rs as $v ) { 
    217. $banners[$v['fields']['SHOWCASE']] = array( 
    218. 'html' => $v['html'] 
    219. ); 
    220. } 
    221. } 
    222.  
    223. $this->arResult = array( 
    224. 'brands' => $brands, 
    225. 'banners' => $banners, 
    226. 'sections' => $sections 
    227. ); 
    228. $this->includeComponentTemplate(); 
    229. } 
    230. private function getParentSection($sectionID,$sections){ 
    231. if(!array_key_exists($sectionID,$sections)){ 
    232. foreach($sections as $key=>$sectArr){ 
    233. if(array_key_exists($sectionID,$sectArr['items'])){ 
    234. return $key; 
    235. } 
    236.  
    237. } 
    238. return false; 
    239. }else{ 
    240. return $sectionID; 
    241. } 
    242. } 
    243. }
    244.  
    Где включить кеширование в настройках компонента я знаю, а вот если нет таких настроек то где прописать в коде и что прописать что бы кеширование заработало?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Очень мало информации, её не достаточно чтобы помочь.
    Очень сложное задание для помощи на форуме, когда хочешь чтобы всё сделали за тебя, а не просто подсказку.

    Можно подождать кто хорошо знаком с Bitrix и он подскажет, ещё можно документацию по нему посмотреть.
    Возможно есть форум по Bitrix и там люди которые с ним каждый день работают, смогу тебе помочь.

    Могу перенести тему в раздел "free-lance" или "сделайте за меня".
     
  3. Evg82

    Evg82 Активный пользователь

    С нами с:
    5 авг 2015
    Сообщения:
    18
    Симпатии:
    0
    Да не надо переносить. Я по всем форумам в т.ч и по битрикс раскидал сообщение.... молчат
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Всё из-за сложности, но могу и ошибаться.
    По этому проще, до заказать кэширование на free-lance.