A
A
Anastasia Panfilova2017-02-09 13:45:49
PHP
Anastasia Panfilova, 2017-02-09 13:45:49

How does CPHPCache work?

I don't understand how CPHPCache works,
I need to save a selection of elements in directories with the code name of the section in which they are located. the whole thing is done through an ajax request, so the data needs to be returned.
I got something like this .. non-working .. and it seems completely wrong.
How to correctly use 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));
    }

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Andrey Nikolaev, 2017-02-09
@nemarta

Step 1: dev.1c-bitrix.ru/api_help/main/reference/cphpcache...
Step 2: dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LES...
Code below:

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();

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question