1
0
mirror of https://github.com/vichan-devel/vichan.git synced 2024-11-28 01:10:51 +01:00
vichan/inc/cache.php

215 lines
4.8 KiB
PHP
Raw Normal View History

2011-10-07 07:51:19 +02:00
<?php
2012-04-10 17:18:38 +02:00
2012-04-11 18:49:22 +02:00
/*
2013-01-20 11:23:46 +01:00
* Copyright (c) 2010-2013 Tinyboard Development Group
2012-04-11 18:49:22 +02:00
*/
defined('TINYBOARD') or exit;
2012-04-11 18:49:22 +02:00
2012-04-10 17:18:38 +02:00
class Cache {
private static $cache;
public static function init() {
global $config;
2012-04-12 16:18:19 +02:00
switch ($config['cache']['enabled']) {
2012-04-10 17:18:38 +02:00
case 'memcached':
self::$cache = new Memcached();
self::$cache->addServers($config['cache']['memcached']);
break;
case 'redis':
self::$cache = new Redis();
self::$cache->connect($config['cache']['redis'][0], $config['cache']['redis'][1]);
if ($config['cache']['redis'][2]) {
self::$cache->auth($config['cache']['redis'][2]);
}
self::$cache->select($config['cache']['redis'][3]) or die('cache select failure');
break;
2012-04-10 17:18:38 +02:00
case 'php':
2012-08-27 13:50:15 +02:00
self::$cache = array();
2012-04-10 17:18:38 +02:00
break;
2011-10-07 07:51:19 +02:00
}
2012-04-10 17:18:38 +02:00
}
public static function get($key) {
global $config, $debug;
$key = $config['cache']['prefix'] . $key;
$data = false;
2012-04-12 16:18:19 +02:00
switch ($config['cache']['enabled']) {
2012-04-10 17:18:38 +02:00
case 'memcached':
2012-04-12 16:18:19 +02:00
if (!self::$cache)
2012-04-10 17:18:38 +02:00
self::init();
$data = self::$cache->get($key);
break;
case 'apc':
$data = apc_fetch($key);
break;
2022-08-29 17:45:59 +02:00
case 'apcu':
$data = apcu_fetch($key);
break;
2012-04-10 17:18:38 +02:00
case 'xcache':
$data = xcache_get($key);
break;
case 'php':
$data = isset(self::$cache[$key]) ? self::$cache[$key] : false;
break;
2015-04-05 17:13:55 +02:00
case 'fs':
$key = str_replace('/', '::', $key);
$key = str_replace("\0", '', $key);
if (!file_exists('tmp/cache/'.$key)) {
$data = false;
}
else {
$data = file_get_contents('tmp/cache/'.$key);
$data = json_decode($data, true);
}
break;
case 'redis':
if (!self::$cache)
self::init();
$data = json_decode(self::$cache->get($key), true);
break;
2011-10-07 07:51:19 +02:00
}
2012-04-10 17:18:38 +02:00
if ($config['debug'])
$debug['cached'][] = $key . ($data === false ? ' (miss)' : ' (hit)');
2012-04-10 17:18:38 +02:00
return $data;
}
public static function set($key, $value, $expires = false) {
global $config, $debug;
2012-04-10 17:18:38 +02:00
$key = $config['cache']['prefix'] . $key;
2012-04-12 16:18:19 +02:00
if (!$expires)
2012-04-10 17:18:38 +02:00
$expires = $config['cache']['timeout'];
2012-04-12 16:18:19 +02:00
switch ($config['cache']['enabled']) {
2012-04-10 17:18:38 +02:00
case 'memcached':
2012-04-12 16:18:19 +02:00
if (!self::$cache)
2012-04-10 17:18:38 +02:00
self::init();
self::$cache->set($key, $value, $expires);
break;
case 'redis':
if (!self::$cache)
self::init();
self::$cache->setex($key, $expires, json_encode($value));
break;
2012-04-10 17:18:38 +02:00
case 'apc':
apc_store($key, $value, $expires);
break;
2022-08-29 17:45:59 +02:00
case 'apcu':
apcu_store($key, $value, $expires);
break;
2012-04-10 17:18:38 +02:00
case 'xcache':
xcache_set($key, $value, $expires);
break;
2015-04-05 17:13:55 +02:00
case 'fs':
$key = str_replace('/', '::', $key);
$key = str_replace("\0", '', $key);
file_put_contents('tmp/cache/'.$key, json_encode($value));
break;
2012-04-10 17:18:38 +02:00
case 'php':
self::$cache[$key] = $value;
break;
}
if ($config['debug'])
$debug['cached'][] = $key . ' (set)';
2012-04-10 17:18:38 +02:00
}
public static function delete($key) {
global $config, $debug;
2012-04-10 17:18:38 +02:00
$key = $config['cache']['prefix'] . $key;
2012-04-12 16:18:19 +02:00
switch ($config['cache']['enabled']) {
2012-04-10 17:18:38 +02:00
case 'memcached':
2012-04-12 16:18:19 +02:00
if (!self::$cache)
2012-04-10 17:18:38 +02:00
self::init();
self::$cache->delete($key);
break;
case 'redis':
if (!self::$cache)
self::init();
self::$cache->del($key);
break;
2012-04-10 17:18:38 +02:00
case 'apc':
apc_delete($key);
break;
2022-08-29 17:45:59 +02:00
case 'apcu':
apcu_delete($key);
break;
2012-04-10 17:18:38 +02:00
case 'xcache':
xcache_unset($key);
break;
2015-04-05 17:13:55 +02:00
case 'fs':
$key = str_replace('/', '::', $key);
$key = str_replace("\0", '', $key);
2015-04-06 22:51:02 +02:00
@unlink('tmp/cache/'.$key);
2015-04-05 17:13:55 +02:00
break;
2012-04-10 17:18:38 +02:00
case 'php':
unset(self::$cache[$key]);
break;
2011-10-07 07:51:19 +02:00
}
if ($config['debug'])
$debug['cached'][] = $key . ' (deleted)';
2012-04-10 17:18:38 +02:00
}
public static function flush() {
global $config;
2012-04-12 16:18:19 +02:00
switch ($config['cache']['enabled']) {
2012-04-10 17:18:38 +02:00
case 'memcached':
2012-04-12 16:18:19 +02:00
if (!self::$cache)
2012-04-10 17:18:38 +02:00
self::init();
return self::$cache->flush();
case 'apc':
return apc_clear_cache('user');
2022-08-29 17:45:59 +02:00
case 'apcu':
return apcu_clear_cache('user');
2012-04-10 17:18:38 +02:00
case 'php':
2013-09-06 19:09:52 +02:00
self::$cache = array();
2012-04-10 17:18:38 +02:00
break;
2015-04-05 17:13:55 +02:00
case 'fs':
$files = glob('tmp/cache/*');
foreach ($files as $file) {
unlink($file);
}
break;
case 'redis':
if (!self::$cache)
self::init();
return self::$cache->flushDB();
2011-10-07 07:51:19 +02:00
}
2012-04-10 17:18:38 +02:00
return false;
2011-10-07 07:51:19 +02:00
}
2012-04-10 17:18:38 +02:00
}
2023-03-29 23:59:28 +02:00
class Twig_Cache_TinyboardFilesystem extends Twig\Cache\FilesystemCache
{
private $directory;
private $options;
/**
* {@inheritdoc}
*/
public function __construct($directory, $options = 0)
{
parent::__construct($directory, $options);
$this->directory = $directory;
}
/**
* This function was removed in Twig 2.x due to developer views on the Twig library. Who says we can't keep it for ourselves though?
*/
public function clear()
{
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->directory), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
if ($file->isFile()) {
@unlink($file->getPathname());
}
}
}
}