[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/libraries/Smarty/libs/sysplugins/ -> smarty_internal_cacheresource_file.php (source)

   1  <?php
   2  /**
   3   * Smarty Internal Plugin CacheResource File
   4   *
   5   * @package Smarty
   6   * @subpackage Cacher
   7   * @author Uwe Tews
   8   * @author Rodney Rehm
   9   */
  10  
  11  /**
  12   * This class does contain all necessary methods for the HTML cache on file system
  13   *
  14   * Implements the file system as resource for the HTML cache Version ussing nocache inserts.
  15   *
  16   * @package Smarty
  17   * @subpackage Cacher
  18   */
  19  class Smarty_Internal_CacheResource_File extends Smarty_CacheResource {
  20  
  21      /**
  22       * populate Cached Object with meta data from Resource
  23       *
  24       * @param Smarty_Template_Cached   $cached    cached object
  25       * @param Smarty_Internal_Template $_template template object
  26       * @return void
  27       */
  28      public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
  29      {
  30          $_source_file_path = str_replace(':', '.', $_template->source->filepath);
  31          $_cache_id = isset($_template->cache_id) ? preg_replace('![^\w\|]+!', '_', $_template->cache_id) : null;
  32          $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
  33          $_filepath = $_template->source->uid;
  34          // if use_sub_dirs, break file into directories
  35          if ($_template->smarty->use_sub_dirs) {
  36              $_filepath = substr($_filepath, 0, 2) . DS
  37                  . substr($_filepath, 2, 2) . DS
  38                  . substr($_filepath, 4, 2) . DS
  39                  . $_filepath;
  40          }
  41          $_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
  42          if (isset($_cache_id)) {
  43              $_cache_id = str_replace('|', $_compile_dir_sep, $_cache_id) . $_compile_dir_sep;
  44          } else {
  45              $_cache_id = '';
  46          }
  47          if (isset($_compile_id)) {
  48              $_compile_id = $_compile_id . $_compile_dir_sep;
  49          } else {
  50              $_compile_id = '';
  51          }
  52          $_cache_dir = $_template->smarty->getCacheDir();
  53          if ($_template->smarty->cache_locking) {
  54              // create locking file name
  55              // relative file name?
  56              if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_cache_dir)) {
  57                  $_lock_dir = rtrim(getcwd(), '/\\') . DS . $_cache_dir;
  58              } else {
  59                  $_lock_dir = $_cache_dir;
  60              }
  61              $cached->lock_id = $_lock_dir.sha1($_cache_id.$_compile_id.$_template->source->uid).'.lock';
  62          }
  63          $cached->filepath = $_cache_dir . $_cache_id . $_compile_id . $_filepath . '.' . basename($_source_file_path) . '.php';
  64          $cached->timestamp = @filemtime($cached->filepath);
  65          $cached->exists = !!$cached->timestamp;
  66      }
  67  
  68      /**
  69       * populate Cached Object with timestamp and exists from Resource
  70       *
  71       * @param Smarty_Template_Cached $cached cached object
  72       * @return void
  73       */
  74      public function populateTimestamp(Smarty_Template_Cached $cached)
  75      {
  76          $cached->timestamp = @filemtime($cached->filepath);
  77          $cached->exists = !!$cached->timestamp;
  78      }
  79  
  80      /**
  81       * Read the cached template and process its header
  82       *
  83       * @param Smarty_Internal_Template $_template template object
  84       * @param Smarty_Template_Cached $cached cached object
  85       * @return booelan true or false if the cached content does not exist
  86       */
  87      public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)
  88      {
  89          $_smarty_tpl = $_template;
  90          return @include $_template->cached->filepath;
  91      }
  92  
  93      /**
  94       * Write the rendered template output to cache
  95       *
  96       * @param Smarty_Internal_Template $_template template object
  97       * @param string                   $content   content to cache
  98       * @return boolean success
  99       */
 100      public function writeCachedContent(Smarty_Internal_Template $_template, $content)
 101      {
 102          if (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) {
 103              $_template->cached->timestamp = filemtime($_template->cached->filepath);
 104              $_template->cached->exists = !!$_template->cached->timestamp;
 105              return true;
 106          }
 107          return false;
 108      }
 109  
 110      /**
 111       * Empty cache
 112       *
 113       * @param Smarty_Internal_Template $_template template object
 114       * @param integer                  $exp_time  expiration time (number of seconds, not timestamp)
 115       * @return integer number of cache files deleted
 116       */
 117      public function clearAll(Smarty $smarty, $exp_time = null)
 118      {
 119          return $this->clear($smarty, null, null, null, $exp_time);
 120      }
 121  
 122      /**
 123       * Empty cache for a specific template
 124       *
 125       * @param Smarty  $_template     template object
 126       * @param string  $resource_name template name
 127       * @param string  $cache_id      cache id
 128       * @param string  $compile_id    compile id
 129       * @param integer $exp_time      expiration time (number of seconds, not timestamp)
 130       * @return integer number of cache files deleted
 131      */
 132      public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
 133      {
 134          $_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
 135          $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
 136          $_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
 137          $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
 138          $_dir = $smarty->getCacheDir();
 139          $_dir_length = strlen($_dir);
 140          if (isset($_cache_id)) {
 141              $_cache_id_parts = explode('|', $_cache_id);
 142              $_cache_id_parts_count = count($_cache_id_parts);
 143              if ($smarty->use_sub_dirs) {
 144                  foreach ($_cache_id_parts as $id_part) {
 145                      $_dir .= $id_part . DS;
 146                  }
 147              }
 148          }
 149          if (isset($resource_name)) {
 150              $_save_stat = $smarty->caching;
 151              $smarty->caching = true;
 152              $tpl = new $smarty->template_class($resource_name, $smarty);
 153              $smarty->caching = $_save_stat;
 154  
 155              // remove from template cache
 156              $tpl->source; // have the template registered before unset()
 157              if ($smarty->allow_ambiguous_resources) {
 158                  $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
 159              } else {
 160                  $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
 161              }
 162              if (isset($_templateId[150])) {
 163                  $_templateId = sha1($_templateId);
 164              }
 165              unset($smarty->template_objects[$_templateId]);
 166  
 167              if ($tpl->source->exists) {
 168                  $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath));
 169              } else {
 170                  return 0;
 171              }
 172          }
 173          $_count = 0;
 174          $_time = time();
 175          if (file_exists($_dir)) {
 176              $_cacheDirs = new RecursiveDirectoryIterator($_dir);
 177              $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
 178              foreach ($_cache as $_file) {
 179                  if (substr($_file->getBasename(),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
 180                  // directory ?
 181                  if ($_file->isDir()) {
 182                      if (!$_cache->isDot()) {
 183                          // delete folder if empty
 184                          @rmdir($_file->getPathname());
 185                      }
 186                  } else {
 187                      $_parts = explode($_dir_sep, str_replace('\\', '/', substr((string)$_file, $_dir_length)));
 188                      $_parts_count = count($_parts);
 189                      // check name
 190                      if (isset($resource_name)) {
 191                          if ($_parts[$_parts_count-1] != $_resourcename_parts) {
 192                              continue;
 193                          }
 194                      }
 195                      // check compile id
 196                      if (isset($_compile_id) && (!isset($_parts[$_parts_count-2 - $_compile_id_offset]) || $_parts[$_parts_count-2 - $_compile_id_offset] != $_compile_id)) {
 197                          continue;
 198                      }
 199                      // check cache id
 200                      if (isset($_cache_id)) {
 201                          // count of cache id parts
 202                          $_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset : $_parts_count - 1 - $_compile_id_offset;
 203                          if ($_parts_count < $_cache_id_parts_count) {
 204                              continue;
 205                          }
 206                          for ($i = 0; $i < $_cache_id_parts_count; $i++) {
 207                              if ($_parts[$i] != $_cache_id_parts[$i]) continue 2;
 208                          }
 209                      }
 210                      // expired ?
 211                      if (isset($exp_time) && $_time - @filemtime($_file) < $exp_time) {
 212                          continue;
 213                      }
 214                      $_count += @unlink((string) $_file) ? 1 : 0;
 215                  }
 216              }
 217          }
 218          return $_count;
 219      }
 220  
 221      /**
 222       * Check is cache is locked for this template
 223       *
 224       * @param Smarty $smarty Smarty object
 225       * @param Smarty_Template_Cached $cached cached object
 226       * @return booelan true or false if cache is locked
 227       */
 228      public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
 229      {
 230          if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
 231              clearstatcache(true, $cached->lock_id);
 232          } else {
 233              clearstatcache();
 234          }
 235          $t = @filemtime($cached->lock_id);
 236          return $t && (time() - $t < $smarty->locking_timeout);
 237      }
 238  
 239      /**
 240       * Lock cache for this template
 241       *
 242       * @param Smarty $smarty Smarty object
 243       * @param Smarty_Template_Cached $cached cached object
 244       */
 245      public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
 246      {
 247          $cached->is_locked = true;
 248          touch($cached->lock_id);
 249      }
 250  
 251      /**
 252       * Unlock cache for this template
 253       *
 254       * @param Smarty $smarty Smarty object
 255       * @param Smarty_Template_Cached $cached cached object
 256       */
 257      public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
 258      {
 259          $cached->is_locked = false;
 260          @unlink($cached->lock_id);
 261      }
 262  }
 263  
 264  ?>


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1