The version of vichan running on lainchan.org
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

174 lignes
3.8KB

  1. <?php
  2. /*
  3. * Copyright (c) 2010-2013 Tinyboard Development Group
  4. */
  5. defined('TINYBOARD') or exit;
  6. class Cache {
  7. private static $cache;
  8. public static function init() {
  9. global $config;
  10. switch ($config['cache']['enabled']) {
  11. case 'memcached':
  12. self::$cache = new Memcached();
  13. self::$cache->addServers($config['cache']['memcached']);
  14. break;
  15. case 'redis':
  16. self::$cache = new Redis();
  17. self::$cache->connect($config['cache']['redis'][0], $config['cache']['redis'][1]);
  18. if ($config['cache']['redis'][2]) {
  19. self::$cache->auth($config['cache']['redis'][2]);
  20. }
  21. self::$cache->select($config['cache']['redis'][3]) or die('cache select failure');
  22. break;
  23. case 'php':
  24. self::$cache = array();
  25. break;
  26. }
  27. }
  28. public static function get($key) {
  29. global $config, $debug;
  30. $key = $config['cache']['prefix'] . $key;
  31. $data = false;
  32. switch ($config['cache']['enabled']) {
  33. case 'memcached':
  34. if (!self::$cache)
  35. self::init();
  36. $data = self::$cache->get($key);
  37. break;
  38. case 'apc':
  39. $data = apc_fetch($key);
  40. break;
  41. case 'xcache':
  42. $data = xcache_get($key);
  43. break;
  44. case 'php':
  45. $data = isset(self::$cache[$key]) ? self::$cache[$key] : false;
  46. break;
  47. case 'fs':
  48. $key = str_replace('/', '::', $key);
  49. $key = str_replace("\0", '', $key);
  50. if (!file_exists('tmp/cache/'.$key)) {
  51. $data = false;
  52. }
  53. else {
  54. $data = file_get_contents('tmp/cache/'.$key);
  55. $data = json_decode($data, true);
  56. }
  57. break;
  58. case 'redis':
  59. if (!self::$cache)
  60. self::init();
  61. $data = json_decode(self::$cache->get($key), true);
  62. break;
  63. }
  64. if ($config['debug'])
  65. $debug['cached'][] = $key . ($data === false ? ' (miss)' : ' (hit)');
  66. return $data;
  67. }
  68. public static function set($key, $value, $expires = false) {
  69. global $config, $debug;
  70. $key = $config['cache']['prefix'] . $key;
  71. if (!$expires)
  72. $expires = $config['cache']['timeout'];
  73. switch ($config['cache']['enabled']) {
  74. case 'memcached':
  75. if (!self::$cache)
  76. self::init();
  77. self::$cache->set($key, $value, $expires);
  78. break;
  79. case 'redis':
  80. if (!self::$cache)
  81. self::init();
  82. self::$cache->setex($key, $expires, json_encode($value));
  83. break;
  84. case 'apc':
  85. apc_store($key, $value, $expires);
  86. break;
  87. case 'xcache':
  88. xcache_set($key, $value, $expires);
  89. break;
  90. case 'fs':
  91. $key = str_replace('/', '::', $key);
  92. $key = str_replace("\0", '', $key);
  93. file_put_contents('tmp/cache/'.$key, json_encode($value));
  94. break;
  95. case 'php':
  96. self::$cache[$key] = $value;
  97. break;
  98. }
  99. if ($config['debug'])
  100. $debug['cached'][] = $key . ' (set)';
  101. }
  102. public static function delete($key) {
  103. global $config, $debug;
  104. $key = $config['cache']['prefix'] . $key;
  105. switch ($config['cache']['enabled']) {
  106. case 'memcached':
  107. case 'redis':
  108. if (!self::$cache)
  109. self::init();
  110. self::$cache->delete($key);
  111. break;
  112. case 'apc':
  113. apc_delete($key);
  114. break;
  115. case 'xcache':
  116. xcache_unset($key);
  117. break;
  118. case 'fs':
  119. $key = str_replace('/', '::', $key);
  120. $key = str_replace("\0", '', $key);
  121. @unlink('tmp/cache/'.$key);
  122. break;
  123. case 'php':
  124. unset(self::$cache[$key]);
  125. break;
  126. }
  127. if ($config['debug'])
  128. $debug['cached'][] = $key . ' (deleted)';
  129. }
  130. public static function flush() {
  131. global $config;
  132. switch ($config['cache']['enabled']) {
  133. case 'memcached':
  134. if (!self::$cache)
  135. self::init();
  136. return self::$cache->flush();
  137. case 'apc':
  138. return apc_clear_cache('user');
  139. case 'php':
  140. self::$cache = array();
  141. break;
  142. case 'fs':
  143. $files = glob('tmp/cache/*');
  144. foreach ($files as $file) {
  145. unlink($file);
  146. }
  147. break;
  148. case 'redis':
  149. if (!self::$cache)
  150. self::init();
  151. return self::$cache->flushDB();
  152. }
  153. return false;
  154. }
  155. }