aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2023-06-22 11:33:08 +0000
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2023-06-22 11:33:08 +0000
commit9b9e88f7f692d7daf6c19deb2428431b15069604 (patch)
tree93e643f26cc9efb6bfb0b0eb3d4b2cd103fd033c
parent5da08f6c40f714fd37860f3ac19662888aa3780b (diff)
wrap any cache other than memory cache into a wrapper that caches the cache in memory, fixes #2202
Closes #2202 Merge request studip/studip!1782
-rw-r--r--lib/classes/StudipCacheFactory.class.php26
-rw-r--r--lib/classes/StudipCacheWrapper.php67
2 files changed, 82 insertions, 11 deletions
diff --git a/lib/classes/StudipCacheFactory.class.php b/lib/classes/StudipCacheFactory.class.php
index 5332e06..77c5973 100644
--- a/lib/classes/StudipCacheFactory.class.php
+++ b/lib/classes/StudipCacheFactory.class.php
@@ -54,11 +54,9 @@ class StudipCacheFactory
/**
- * @param Config an instance of class Config which will be used to
- * determine the class of the implementation of interface
- * StudipCache
- *
- * @return void
+ * @param Config $config an instance of class Config which will be used to
+ * determine the class of the implementation of interface
+ * StudipCache
*/
public static function setConfig($config)
{
@@ -68,8 +66,6 @@ class StudipCacheFactory
/**
* Resets the configuration and voids the cache instance.
- *
- * @return void
*/
public static function unconfigure()
{
@@ -174,18 +170,26 @@ class StudipCacheFactory
}
/**
- * Return an instance of a given class using some arguments
+ * Return an instance of a given class using some arguments. Unless the
+ * memory cache is instantiated, the cache will be wrapped in a wrapper
+ * class that uses a memory cache to reduce accesses to the cache.
*
- * @param string the name of the class
- * @param array an array of arguments to be used by the constructor
+ * @param string $class the name of the class
+ * @param array $arguments an array of arguments to be used by the constructor
*
* @return StudipCache an instance of the specified class
*/
public static function instantiateCache($class, $arguments)
{
$reflection_class = new ReflectionClass($class);
- return (is_array($arguments['config']) && count($arguments['config']) > 0)
+ $cache = (is_array($arguments['config']) && count($arguments['config']) > 0)
? $reflection_class->newInstanceArgs($arguments['config'])
: $reflection_class->newInstance();
+
+ if ($class !== StudipMemoryCache::class) {
+ return new StudipCacheWrapper($cache);
+ }
+
+ return $cache;
}
}
diff --git a/lib/classes/StudipCacheWrapper.php b/lib/classes/StudipCacheWrapper.php
new file mode 100644
index 0000000..65c5edb
--- /dev/null
+++ b/lib/classes/StudipCacheWrapper.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * The cache wrapper wraps a memory cache around another cache. This should
+ * reduce the accesses to the actual cache.
+ *
+ * @author Jan-Hendrik Willms <tleilax+studip@gmail.com>
+ * @license GPL2 or any later version
+ * @since Stud.IP 5.4
+ */
+class StudipCacheWrapper implements StudipCache
+{
+ const DEFAULT_MEMORY_EXPIRATION = 60;
+
+ protected $actual_cache;
+ protected $memory_cache;
+
+ public function __construct(StudipCache $actual_cache)
+ {
+ $this->actual_cache = $actual_cache;
+ $this->memory_cache = new StudipMemoryCache();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function expire($arg)
+ {
+ $this->memory_cache->expire($arg);
+ $this->actual_cache->expire($arg);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function flush()
+ {
+ $this->memory_cache->flush();
+ $this->actual_cache->flush();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function read($arg)
+ {
+ $cached = $this->memory_cache->read($arg);
+ if ($cached !== false) {
+ return $cached;
+ }
+
+ $cached = $this->actual_cache->read($arg);
+ if ($cached !== false) {
+ $this->memory_cache->write($arg, $cached, self::DEFAULT_MEMORY_EXPIRATION);
+ }
+ return $cached;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write($name, $content, $expires = self::DEFAULT_EXPIRATION)
+ {
+ $this->memory_cache->expire($name);
+ $this->actual_cache->write($name, $content, $expires);
+ }
+}