Документация для разработчиков
Темная тема

Класс CPhpCache

CPhpCache - класс для кеширования PHP переменных и HTML результата выполнения скрипта.

Методы класса

Метод Описание С версии
StartDataCache Инициализирует механизм кеширования и начинает буферизацию или выводит содержимое из кеша.
EndDataCache Сохраняет буферизированный HTML и PHP переменные файле кеша.
InitCache Инициализирует механизм кеширования.
GetVars Возвращает сохраненные в кеше PHP переменные.
Output Выводит сохраненный в кеше HTML результат.
IsCacheExpired Проверяет истек ли период жизни кэша.3.3.7
CleanDir Метод очищает кеш по параметру basedir.8.5.1
AbortDataCache Отменяет создание текущего кэша.5.1.8

Смотрите также

  • Кеширование
  • Класс CPageCache
  • Специальные параметры


  • Пользовательские комментарии

    Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

    Для этого нужно всего лишь авторизоваться на сайте

    Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

    Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
    0
    Сергей Недзиев
    В примере выше есть присваивание $cache_time = 3600 и это значение не меняется. После чего 2 раза делается проверка if ( $cache_time > 0..  - это лишнее, т.к. заранее известно, что $cache_time = 3600 а значит больше нуля.
    7
    Валерий Дьяченко
    Как вариант, можно написать свою функцию, на основе стандартного API, и передавать в неё collback с параметрами. Это особенно удобно, когда нужно кешировать много данных. Таким образом снижается избыточность кода, и улучшается понимание кода.

    Например, у нас есть такой код, который что-то достает из БД:
    Код
    // getting data BX API
       // use $arParams = array(1,2,3) ...
       // $something = ...

    Оборачиваем данный код в функцию, которая возвращает результат выборки:
    Код
    function myFunc($arParams) {
       // getting data BX API
       // use $arParams = array(1,2,3) ...
       // $something = ...
       return $something;
    }

    И передаем полученную функцию как callback в нашу функцию кеширования:
    Код
    $arMyFuncParams = array(1,2,3)
    $cachedData = returnResultCache(86400, 'somethingId', 'myFunc', $arMyFuncParams);

    На этом всё. Как видно, такое использование проще и понятнее, чем каждый раз использовать API напрямую. А вот код функции returnResultCache, которую можно разместить в init.php для многократного использования:
    Код
    function returnResultCache($timeSeconds, $cacheId, $callback, $arCallbackParams = '') {
        $obCache = new CPHPCache();
        $cachePath = '/'.SITE_ID.'/'.$cacheId;
        if( $obCache->InitCache($timeSeconds, $cacheId, $cachePath) ) {
            $vars = $obCache->GetVars();
            $result = $vars['result'];
        }
        elseif( $obCache->StartDataCache()  ) {
            $result = $callback($arCallbackParams);
            $obCache->EndDataCache(array('result' => $result));
        }
        return $result;
    }
    2
    Vadim Adamlyuk
    В документации везде обходится стороной вопрос обновления кэша, в случае когда TTL (время хранения) не истекло.

    Сохрание нового содержимого в кэше возможно только через предварительно удаление старого содержимого
    путем вызова методов cleanDir() или clean() с указанием тэга (что более правильно)
    17
    Игорь Барковский
    Общая схема работы с кэшированием с помощью этого класса такова:
    Код
    $obCache = new CPHPCache();
    if( $obCache->InitCache(/*задать ttl, cacheID и cachePath*/) )// Если кэш валиден
    {
       $vars = $obCache->GetVars();// Извлечение переменных из кэша
    }
    elseif( $obCache->StartDataCache()  )// Если кэш невалиден
    {
       /*Тяжелые вычисления*/
       $obCache->EndDataCache(/*массив с переменными*/);// Сохраняем переменные в кэш.
    }
    /*Можно оперировать полученными переменными*/
    


    И пример получения ID всех доступных элементов инфоблоков:

    Код
    $obCache = new CPHPCache();
    $cacheLifetime = 86400*7; $cacheID = 'AllItemsIDs'; $cachePath = '/'.$cacheID;
    if( $obCache->InitCache($cacheLifetime, $cacheID, $cachePath) )
    {
       $vars = $obCache->GetVars();
       extract($vars);
       // или же 
       $arAllItemsIDs = $vars['arAllItemsIDs'];
    }
    elseif( $obCache->StartDataCache()  )
    {
       $rs = CIBlockElement::GetList(array(), array(), false, false, array('ID'));
       while( $ar = $rs->Fetch() )
          $arAllItemsIDs[] = $ar['ID'];
       $obCache->EndDataCache(array('arAllItemsIDs' => $arAllItemsIDs));
    }
    
    print_r(count($arAllItemsIDs));
    
    
    15
    Игорь Шевчик
    Пример кеширования, на мой взгляд более наглядный чем в документации

    Код
    $cntIBLOCK_List = 10;
    $cache = new CPHPCache();
    $cache_time = 3600;
    $cache_id = 'arIBlockListID'.$cntIBLOCK_List;
    $cache_path = '/arIBlockListID/';
    if ($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, $cache_path))
    {
       $res = $cache->GetVars();
       if (is_array($res["arIBlockListID"]) && (count($res["arIBlockListID"]) > 0))
          $arIBlockListID = $res["arIBlockListID"];
    }
    if (!is_array($arIBlockListID))
    {
       $res = CIBlock::GetList(
          Array(), 
          Array(
             'TYPE' => 'catalog', 
             'SITE_ID' => SITE_ID, 
             'ACTIVE' => 'Y', 
             "CNT_ACTIVE" => "Y", 
             "!CODE" => 'test%'
          ), true
       );
       while($ar_res = $res->Fetch())
       {
          if($ar_res['ELEMENT_CNT'] > 0)
          $arIBlockListID[] = $ar_res['ID'];
       }
       //////////// end cache /////////
       if ($cache_time > 0)
       {
             $cache->StartDataCache($cache_time, $cache_id, $cache_path);
             $cache->EndDataCache(array("arIBlockListID"=>$arIBlockListID));
       }
    }
     
    © «Битрикс», 2001-2024, «1С-Битрикс», 2024
    Наверх