Как работает CPHPCache?

не понимаю как работает CPHPCache
мне нужно сохранять выборку элементов в директориях с названием кода раздела, в котором они находятся. всё это дело делается через аякс запрос, поэтому данные нужно вернуть.
получилось у меня что-то такое.. нерабочее.. и кажется совсем неправильное.
как грамотно воспользоваться CPHPCache?
$code = $_POST["code"]; //код раздела
    $cache = new CPHPCache();
    $cache_time = 86400*7;
    $cache_id = 'sectCache'.$code;
    $cache_path = '/sectCache/'.$code;

    if($cache->InitCache($cache_time, $cache_id, $cache_path)){
        $vars[$code] = $cache->GetVars();
        echo json_encode($vars[$code]);
    } elseif(!is_array($vars[$code])){
        $mass = array();
        $arSelect = Array("ID", "NAME", "PROPERTY_YEAR", "PREVIEW_PICTURE", "PROPERTY_MODEL", "PROPERTY_WORKS", "PROPERTY_COST_WORK", "PROPERTY_COST_DETAILS", "PROPERTY_DISCOUNT_WORK", "PROPERTY_DISCOUNT_DETAILS");
        if($code == "all-brands") {$arFilter = Array("IBLOCK_ID"=>1, "ACTIVE"=>"Y", "INCLUDE_SUBSECTIONS"=>"Y");} else {$arFilter = Array("IBLOCK_ID"=>1, "ACTIVE"=>"Y", "SECTION_CODE"=>$code);}
        $res = CIBlockElement::GetList(array("ID"=>"DESC"), $arFilter, false, array(), $arSelect);
        while($ob = $res->Fetch())
        {
            $ob["PREVIEW_PICTURE"] = CFile::GetPath($ob["PREVIEW_PICTURE"]);
            array_push($mass, $ob);
        }
        echo json_encode($mass); // И возвращаем
        $cache ->StartDataCache($cache_time, $cache_id, $cache_path);
        $cache ->EndDataCache(array('sectCache'.$code => $mass));
    }
  • Вопрос задан
  • 2484 просмотра
Решения вопроса 1
gromdron
@gromdron
Работаю с Bitrix24
Шаг 1: dev.1c-bitrix.ru/api_help/main/reference/cphpcache...
Шаг 2: dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LES...

Код ниже:
use \Bitrix\Main\Loader;

// Это нужно где-нибудь складировать в init.php/других файлах, т.к. много где может понадобится
define('TARGET_IBLOCK_ID',1);

// Это то, что вернет скрипт
$arReturn = [
    'result' => 'error',
    'data'   => 'Неправильный запрос',
];

$sCode = $_POST["code"];

if ( !empty($sCode) )
{
    // Инициализируем php-кеширование (в хранилище кеша будет помещен json объект)
    $cache = new CPHPCache();

    // Устанавливаем время, на которое нужно кешировать
    $cache_time = 86400*7;

    // Уникальный ID
    $cache_id = 'sectCache'.$code;

    // Папка для хранения кеша
    $cache_path = '/sectCache/'.$code;

    // Проверяем существование кеша
    if ( $cache->InitCache($cache_time, $cache_id, $cache_path) )
    {
        // Кеш есть, достаем данные
        $arCacheData = $cache->GetVars();

        // Достаем по ключу, с которым положили
        $arReturn['data'] = $arCacheData['sectCache'.$sCode];
    } 
    else 
    {
        // Кеша нет, нужно получить данные

        // Хороший тон - проверить, подключен ли модуль
        if ( Loader::IncludeModule('iblock') )
        {
            $arSelect = [
                "ID",
                "NAME",
                "PROPERTY_YEAR",
                "PREVIEW_PICTURE",
                "PROPERTY_MODEL",
                "PROPERTY_WORKS",
                "PROPERTY_COST_WORK",
                "PROPERTY_COST_DETAILS",
                "PROPERTY_DISCOUNT_WORK",
                "PROPERTY_DISCOUNT_DETAILS"
            ];

            /**
             * Фильтр лучше использовать всегда, иначе 
             * при ошибке будет выбор всех элементов 
             */
            $arFilter = [
                'IBLOCK_ID' => TARGET_IBLOCK_ID,
                "ACTIVE"    => "Y",
            ];

            if ( $sCode == "all-brands" )
            {
                $arFilter['INCLUDE_SUBSECTIONS'] = 'Y';
            }
            else
            {
                $arFilter['SECTION_CODE'] = $sCode;
            }

            // Массив элементов
            $arItems = [];

            // Получаем данные
            $res = \CIBlockElement::GetList(["ID"=>"DESC"], $arFilter, false, false, $arSelect);
            while( $arElement = $res->Fetch() )
            {
                $arElement["PREVIEW_PICTURE"] = CFile::GetPath($arElement["PREVIEW_PICTURE"]);

                $arItems[ $arElement['ID'] ] = $arElement;
            }

            // Сохраняем данные в кеше
            $cache->StartDataCache($cache_time, $cache_id, $cache_path);
            $cache->EndDataCache(['sectCache'.$sCode => $arItems]);

            $arReturn['data'] = $arItems;
        }
        else
        {
            $arReturn['data'] = "Модуль инфоблоков не подключен";
        }
    }

}

echo json_encode($arReturn);
die();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы