/core/Cache.php

https://github.com/installero/grappling_hook · PHP · 213 lines · 184 code · 27 blank · 2 comment · 47 complexity · 26ac5cb0e365b3d0311b97d1b19bb0a1 MD5 · raw file

  1. <?php
  2. class Cache {
  3. const CACHE_TYPE_XCACHE = 1;
  4. const CACHE_TYPE_MEMCACHE = 2;
  5. const CACHE_TYPE_FILE = 3;
  6. const DATA_TYPE_XML = 1;
  7. const DATA_TYPE_XSL = 2;
  8. const DATA_TYPE_VAR = 3;
  9. private static $cacheType;
  10. private static $cache_enabled = true;
  11. private static $min_cache_sec = 1;
  12. private static $max_cache_sec = 86400;
  13. private static $cache_folder;
  14. private static $inited = false;
  15. // для каждой темы и языка шаблоны и xml генерируются разные
  16. private static $language = 'ru';
  17. private static $theme = 'default';
  18. public static function init() {
  19. if (self::$inited)
  20. return true;
  21. $memcache_enabled = Config::need('xsl_cache_memcache_enabled', false);
  22. $xcache_enabled = Config::need('xsl_cache_xcache_enabled', false);
  23. $filecache_enabled = Config::need('xsl_cache_file_path', false);
  24. self::$min_cache_sec = Config::need('xml_cache_min_sec');
  25. self::$max_cache_sec = Config::need('xml_cache_max_sec');
  26. if ($xcache_enabled) {
  27. self::$cacheType = self::CACHE_TYPE_XCACHE;
  28. } else if ($memcache_enabled) {
  29. self::$cacheType = self::CACHE_TYPE_MEMCACHE;
  30. } else if ($filecache_enabled) {
  31. self::$cacheType = self::CACHE_TYPE_FILE;
  32. } else
  33. self::$cache_enabled = false;
  34. self::$cache_folder = Config::need('cache_default_folder', '');
  35. self::$inited = true;
  36. global $current_user;
  37. /* @var $current_user CurrentUser */
  38. if ($current_user == null) {
  39. self::$language = Config::need('default_language');
  40. self::$theme = Config::need('default_theme');
  41. } else {
  42. self::$language = $current_user->getLanguage();
  43. self::$theme = $current_user->getTheme();
  44. }
  45. return true;
  46. }
  47. public static function drop($name, $datatype = self::DATA_TYPE_VAR) {
  48. self::init();
  49. switch (self::$cacheType) {
  50. case self::CACHE_TYPE_XCACHE:
  51. self::drop_xcache($name, $datatype);
  52. break;
  53. case self::CACHE_TYPE_MEMCACHE:
  54. break;
  55. case self::CACHE_TYPE_FILE:
  56. self::drop_file($name, $datatype);
  57. break;
  58. }
  59. return false;
  60. }
  61. public static function get($name, $datatype = self::DATA_TYPE_VAR, $cache_sec = 0) {
  62. self::init();
  63. Log::timingplus('cache:get');
  64. switch (self::$cacheType) {
  65. case self::CACHE_TYPE_XCACHE:
  66. $ret = self::get_xcache($name, $datatype);
  67. Log::timingplus('cache:get');
  68. return $ret;
  69. break;
  70. case self::CACHE_TYPE_MEMCACHE:
  71. Log::timingplus('cache:get');
  72. break;
  73. case self::CACHE_TYPE_FILE:
  74. $cache_sec = max(0, (int) $cache_sec);
  75. $ret = self::get_file($name, $datatype, $cache_sec);
  76. Log::timingplus('cache:get');
  77. return $ret;
  78. break;
  79. }
  80. return false;
  81. }
  82. public static function set($name, $value, $cache_seconds = false, $datatype = self::DATA_TYPE_VAR) {
  83. self::init();
  84. Log::timingplus('cache:set');
  85. if (!$cache_seconds)
  86. $cache_seconds = self::$max_cache_sec;
  87. switch (self::$cacheType) {
  88. case self::CACHE_TYPE_XCACHE:
  89. self::set_xcache($name, $value, $datatype, $cache_seconds);
  90. break;
  91. case self::CACHE_TYPE_MEMCACHE:
  92. break;
  93. case self::CACHE_TYPE_FILE:
  94. self::set_file($name, $value, $datatype);
  95. break;
  96. }
  97. Log::timingplus('cache:set');
  98. }
  99. private static function getFolder($datatype) {
  100. $folder = self::$cache_folder;
  101. switch ($datatype) {
  102. case self::DATA_TYPE_XML:
  103. $folder = Config::need('xml_cache_file_path');
  104. break;
  105. case self::DATA_TYPE_XSL:
  106. $folder = Config::need('xsl_cache_file_path');
  107. break;
  108. }
  109. return $folder;
  110. }
  111. private static function drop_file($name, $datatype = self::DATA_TYPE_XML) {
  112. if ($datatype == self::DATA_TYPE_XSL)
  113. $filename = self::getFolder($datatype) . '/' . self::$theme . '_' . self::$language . '_' . $name . '.xsl';
  114. else if ($datatype == self::DATA_TYPE_XML)
  115. $filename = self::getFolder($datatype) . '/' . self::$theme . '_' . self::$language . '_' . $name;
  116. else
  117. $filename = self::getFolder($datatype) . $name;
  118. @unlink($filename);
  119. }
  120. private static function drop_xcache($name, $datatype = self::DATA_TYPE_XML) {
  121. if ($datatype == self::DATA_TYPE_XSL)
  122. $filename = 'xsl_' . self::$theme . '_' . self::$language . '_' . $name . '.xsl';
  123. else if ($datatype == self::DATA_TYPE_XML)
  124. $filename = 'xml_' . self::$theme . '_' . self::$language . '_' . $name;
  125. else
  126. $filename = 'var_' . $name;
  127. @xcache_unset($filename);
  128. Log::logHtml($filename . ' deleted from xcache');
  129. }
  130. private static function get_file($name, $datatype = self::DATA_TYPE_XML, $cache_sec = 0) {
  131. if ($datatype == self::DATA_TYPE_XSL)
  132. $filename = self::getFolder($datatype) . '/' . self::$theme . '_' . self::$language . '_' . $name . '.xsl';
  133. else if ($datatype == self::DATA_TYPE_XML)
  134. $filename = self::getFolder($datatype) . '/' . self::$theme . '_' . self::$language . '_' . $name;
  135. else
  136. $filename = self::getFolder($datatype) . $name;
  137. if (is_readable($filename)) {
  138. $cache_sec = self::normalizeCacheTime($cache_sec);
  139. if ($cache_sec) {
  140. $mtime = filemtime($filename);
  141. if (time() - $mtime > $cache_sec) {
  142. return false;
  143. }
  144. }
  145. return file_get_contents($filename);
  146. }
  147. return false;
  148. }
  149. private static function get_xcache($name, $datatype = self::DATA_TYPE_XML) {
  150. if ($datatype == self::DATA_TYPE_XSL)
  151. $filename = 'xsl_' . self::$theme . '_' . self::$language . '_' . $name . '.xsl';
  152. else if ($datatype == self::DATA_TYPE_XML)
  153. $filename = 'xml_' . self::$theme . '_' . self::$language . '_' . $name;
  154. else
  155. $filename = 'var_' . $name;
  156. $var = xcache_get($filename);
  157. Log::logHtml($filename . ' got from xcache:' . $var);
  158. return $var;
  159. }
  160. private static function get_memcache($name) {
  161. }
  162. private static function set_xcache($name, $value, $datatype = self::DATA_TYPE_VAR, $cache_seconds) {
  163. if ($datatype == self::DATA_TYPE_XSL)
  164. $filename = 'xsl_' . self::$theme . '_' . self::$language . '_' . $name . '.xsl';
  165. else if ($datatype == self::DATA_TYPE_XML)
  166. $filename = 'xml_' . self::$theme . '_' . self::$language . '_' . $name;
  167. else
  168. $filename = 'var_' . $name;
  169. Log::logHtml($filename . ' put into xcache');
  170. xcache_set($filename, $value, $cache_seconds);
  171. }
  172. private static function set_file($name, $value, $datatype = self::DATA_TYPE_VAR) {
  173. if ($datatype == self::DATA_TYPE_XSL)
  174. $filename = self::getFolder($datatype) . '/' . self::$theme . '_' . self::$language . '_' . $name . '.xsl';
  175. else if ($datatype == self::DATA_TYPE_XML)
  176. $filename = self::getFolder($datatype) . '/' . self::$theme . '_' . self::$language . '_' . $name;
  177. else
  178. $filename = self::getFolder($datatype) . $name;
  179. file_put_contents($filename, $value);
  180. }
  181. private static function set_memcache($name, $value, $cache_seconds = false) {
  182. }
  183. private static function normalizeCacheTime($cache_sec) {
  184. return min(self::$max_cache_sec, max(self::$min_cache_sec, $cache_sec));
  185. }
  186. }