The version of vichan running on lainchan.org
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

174 行
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. }