Skip to content

Instantly share code, notes, and snippets.

@di7spider
Last active September 11, 2015 13:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save di7spider/97b9f06e9a267882150d to your computer and use it in GitHub Desktop.
Save di7spider/97b9f06e9a267882150d to your computer and use it in GitHub Desktop.
1C Bitrix :: Class cache highload block
<?
use
\Bitrix\Highloadblock\HighloadBlockTable as HighloadBlockTable;
/** Кэширование Highload блоков */
class CacheHB
{
const DEF_CACHE_FOLDER = 'cache';
const DEF_CACHE_TIME = 36000;
const DEF_CACHE_TIME_HBT = 36000;
const DEF_CACHE_TIME_HB = 36000;
/** Получить даннные из Highload / Cache */
static public function getList($arParams)
{
$queryHBT = is_array($arParams['HBT']) ? $arParams['HBT'] : Array();
/** Получаем таблица HB */
$listHBT = self::cache(
Array(
'key' => sha1(
serialize($queryHBT)
),
'dir' => 'HBT',
'time' => self::DEF_CACHE_TIME_HBT
),
function($ar) use ($queryHBT){
$interateHBT = HighloadBlockTable::getList($queryHBT);
while($arHBT = $interateHBT-> fetch() ){
$listHBT[] = $arHBT;
}
return $listHBT;
}
);
if( is_array($listHBT) ){
/** Получаем данные по каждой из таблиц HB */
foreach($listHBT as $arTable){
$queryHB = $arParams['HB'][ $arTable['NAME'] ];
$queryHB = is_array($queryHB) ? $queryHB : Array();
if( is_array($queryHB['select']) &&
in_array('UF_XML_ID', $queryHB['select']) ){
$queryHB['select'][] = 'UF_XML_ID';
}
$arResult[ $arTable['NAME'] ] = self::cache(
Array(
key' => sha1(
serialize(
Array(
$arTable['NAME'],
$queryHB
)
)
),
'dir' => 'HB',
'time' => self::DEF_CACHE_TIME_HB
),
function($ar) use ($queryHB, $arTable){
HighloadBlockTable::compileEntity($arTable);
$HB = $arTable['NAME']."Table";
$interateHB = $HB::getList($queryHB);
while( $arHB = $interateHB-> fetch() ){
$XID = trim($arHB['UF_XML_ID']);
if( !empty($XID) ){
$arResult[$XID] = $arHB;
}
}
return $arResult;
}
);
}
return $arResult;
}
}
/** Пере кэшировать */
static public function regenCache($arParams)
{
if( $arParams['clean'] !== false ){
$clean = Array(
'HB',
'HBT'
);
$clean = is_array($arParams['clean']) ? $arParams['clean'] : $clean;
}
if( is_array($clean) ){
$obCache = new CPHPCache;
array_map(
function($path) use($obCache){
$obCache-> CleanDir($path, CacheHB::DEF_CACHE_FOLDER);
},
$clean
);
}
self::getList(
$arParams['query']
);
}
/** Кэширует результат выполнения функции */
static protected function cache($cache, $callback, $arParams)
{
if( !empty($callback) && is_callable($callback, true) ){
$obCache = new CPHPCache;
$time = !empty( $cache['time'] ) ? $cache['time'] : self::DEF_CACHE_TIME;
$key = sha1( json_encode( !empty( $cache['key'] ) ? $cache['key'] : $arParams) );
$dir = $cache['dir'];
$folder = !empty( $cache['folder'] ) ? $cache['folder'] : self::DEF_CACHE_FOLDER;
if( !empty($time) && !empty($key) && !empty($dir) && !empty($folder) ){
if( $obCache-> InitCache($time, $key, $dir, $folder) ){
$arCache = $obCache-> GetVars();
$arResult = $arCache["result"];
}else{
$arResult = call_user_func(
$callback,
Array(
'arParams' => $arParams
)
);
if( !empty($arResult) ){
if( $obCache-> StartDataCache($time, $key, $dir, array(), $folder) ){
$obCache-> EndDataCache(
array(
"result" => $arResult
)
);
}
}
}
}
return $arResult;
}
}
}
?>
@di7spider
Copy link
Author

/** Вешаем на cron, будет сбрасывать текущий cache и генерировать новый */
CacheHB::regenCache(
    Array(
        'query' => Array(
            'HBT' => Array(
                'filter' => Array(
                    '!=TABLE_NAME' => 'mdg_stoune'
                )
            )
        )
    )
);

@di7spider
Copy link
Author

/** Получаем данные из Highload или Cache */
$arResult = CacheHB::getList(
    Array(
        /** Query HighloadBlockTable::getList  */
        'HBT' => Array(
            'filter' => Array(
                'NAME' => 'STOUNE'
            )
        ),
        /** Query STOUNETable::getList  */
        'HB' => Array(
            'STOUNE' => Array(
                'select' => Array(
                    'UF_NAME',
                    'UF_CODE'
                )
            )
        )
    )
);

echo "<pre>";
    var_dump(
        $arResult['STOUNE']
    );
echo "</pre>";

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment