Блочное кэширование html-кода в TPL — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кеш, на указанное время. Метод необходимо добавить в файл '''classes/modules/custom.php''':
+
В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кэш, на указанное время. Метод необходимо добавить в файл '''classes/modules/custom.php''':
 
<source lang="php">
 
<source lang="php">
 
public function tplcache($expire = 0, $module = '', $method = '') {
 
public function tplcache($expire = 0, $module = '', $method = '') {
Строка 17: Строка 17:
 
     else $params_path .= "'" . $arg . "'";
 
     else $params_path .= "'" . $arg . "'";
 
   }
 
   }
   // ключ для кеша
+
   // ключ для кэша
 
   $path = $macrosArr['module'] . ' ' . $macrosArr['method'] . '('. $params_path . ')';
 
   $path = $macrosArr['module'] . ' ' . $macrosArr['method'] . '('. $params_path . ')';
 
   $templater = templater::getInstance();
 
   $templater = templater::getInstance();
 
   $cacheFrontend = cacheFrontend::getInstance();
 
   $cacheFrontend = cacheFrontend::getInstance();
   // проверка на активность поддерживаемого кеша, apc, eaccelerator, memcached и т.п.
+
   // проверка на активность поддерживаемого кэша, apc, eaccelerator, memcached и т.п.
 
   if($cacheFrontend->getCurrentCacheEngineName()){
 
   if($cacheFrontend->getCurrentCacheEngineName()){
     // загрузка данных из кеша, промежуточный ключ $path
+
     // загрузка данных из кэша, промежуточный ключ $path
 
     if($data = $cacheFrontend->loadData($path)) {
 
     if($data = $cacheFrontend->loadData($path)) {
 
       return $data;
 
       return $data;
Строка 31: Строка 31:
 
      
 
      
 
     if($expire > 0) {
 
     if($expire > 0) {
       // сохранение данных в кеш
+
       // сохранение данных в кэш
 
       $cacheFrontend->saveData($path, $result, $expire);
 
       $cacheFrontend->saveData($path, $result, $expire);
 
     }
 
     }
 
   }else{
 
   }else{
     // использование файлового кеша, данные хранятся в html-файле
+
     // использование файлового кэша, данные хранятся в html-файле
 
     $cmsController = cmsController::getInstance();
 
     $cmsController = cmsController::getInstance();
 
      
 
      
Строка 46: Строка 46:
 
     $key = sha1($key_path . SYS_CACHE_SALT);
 
     $key = sha1($key_path . SYS_CACHE_SALT);
 
     $data_path = $folder . $key . '.html';
 
     $data_path = $folder . $key . '.html';
     // проверка даты создания файла и времени жизни кеша (expire)
+
     // проверка даты создания файла и времени жизни кэша (expire)
 
     if(is_file($data_path)){
 
     if(is_file($data_path)){
 
       $mtime = filemtime($data_path);
 
       $mtime = filemtime($data_path);
Строка 59: Строка 59:
 
}
 
}
 
</source>
 
</source>
В методе стоит проверка на то, включен ли один из стандартных кеширующих механизмов, в случае если кеш включен, то он и используется, в ином случае используется файловый кеш. Данные файлового кеша сохраняются в папке '''/sys-temp/tplcache/'''.
+
В методе стоит проверка на то, включен ли один из стандартных кэширующих механизмов, в случае если кэш включен, то он и используется, в ином случае используется файловый кэш. Данные файлового кэша сохраняются в папке '''/sys-temp/tplcache/'''.
  
 
Пример стандартного вызова tpl-макроса:
 
Пример стандартного вызова tpl-макроса:
Строка 69: Строка 69:
 
%custom tplcache(600, 'news', 'lastlist', '/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)%
 
%custom tplcache(600, 'news', 'lastlist', '/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)%
 
</pre>
 
</pre>
600 - время хранения кеша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в
+
600 - время хранения кэша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в
 
[http://help-dev.umi-cms.ru/news.lastlist.html документации]
 
[http://help-dev.umi-cms.ru/news.lastlist.html документации]
 
[[Категория:Верстка в TPL]]
 
[[Категория:Верстка в TPL]]
 +
 +
Работает в версиях до 2.8.5 включительно, в версиях 2.8.5.1 и выше уже не работает.

Текущая версия на 11:34, 12 сентября 2012

В данной статье представлен пример кастомного 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 - метод модуля; далее параметры метода в стандартном порядке, как в документации

Работает в версиях до 2.8.5 включительно, в версиях 2.8.5.1 и выше уже не работает.