Блочное кэширование html-кода в TPL

Материал из Umicms
Перейти к:навигация, поиск

В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кэш, на указанное время. Метод необходимо добавить в файл classes/modules/custom.php:

public function tplcache($expire = 0, $module = '', $method = '') {
  $expire = (int) $expire;
  
  $macrosArr = array();
  $macrosArr['module'] = htmlspecialchars($module);
  $macrosArr['method'] = htmlspecialchars($method);
  
  $args = func_get_args();
  $params = array_slice($args, 3);
  $macrosArr['args'] = $params;
  
  $params_path = '';
  foreach($params as $arg){
    if($params_path) $params_path .= ", '" . $arg . "'";
    else $params_path .= "'" . $arg . "'";
  }
  // ключ для кэша
  $path = $macrosArr['module'] . ' ' . $macrosArr['method'] . '('. $params_path . ')';
  $templater = templater::getInstance();
  $cacheFrontend = cacheFrontend::getInstance();
  // проверка на активность поддерживаемого кэша, apc, eaccelerator, memcached и т.п.
  if($cacheFrontend->getCurrentCacheEngineName()){
    // загрузка данных из кэша, промежуточный ключ $path
    if($data = $cacheFrontend->loadData($path)) {
      return $data;
    }
    // выполнение метода, с указанными параметрами
    $result = $templater->executeMacros($macrosArr);
    
    if($expire > 0) {
      // сохранение данных в кэш
      $cacheFrontend->saveData($path, $result, $expire);
    }
  }else{
    // использование файлового кэша, данные хранятся в html-файле
    $cmsController = cmsController::getInstance();
    
    $folder = CURRENT_WORKING_DIR . '/sys-temp/tplcache/';
    if(!is_dir($folder)) mkdir($folder, 0777, true);
    static $lang_id, $domain_id;
    if(!isset($lang_id)) $lang_id = $cmsController->getCurrentLang()->getId();
    if(!isset($domain_id)) $domain_id = $cmsController->getCurrentDomain()->getId();
    $key_path = $path . '_' . $lang_id . '_' . $domain_id;
    $key = sha1($key_path . SYS_CACHE_SALT);
    $data_path = $folder . $key . '.html';
    // проверка даты создания файла и времени жизни кэша (expire)
    if(is_file($data_path)){
      $mtime = filemtime($data_path);
      if(time() < ($mtime + $expire)) {
        return file_get_contents($data_path);
      }
    }
    $result = $templater->executeMacros($macrosArr);
    file_put_contents($data_path, $result);
  }
return $result;
}

В методе стоит проверка на то, включен ли один из стандартных кэширующих механизмов, в случае если кэш включен, то он и используется, в ином случае используется файловый кэш. Данные файлового кэша сохраняются в папке /sys-temp/tplcache/.

Пример стандартного вызова tpl-макроса:

%news lastlist('/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)%

Пример вызова макроса через кастомный метод tplcache:

%custom tplcache(600, 'news', 'lastlist', '/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)%

600 - время хранения кэша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в документации