1: <?php
2: /*
3: You may not change or alter any portion of this comment or credits
4: of supporting developers from this source code or any supporting source code
5: which is considered copyrighted (c) material of the original comment or credit authors.
6:
7: This program is distributed in the hope that it will be useful,
8: but WITHOUT ANY WARRANTY; without even the implied warranty of
9: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10: */
11:
12: namespace Xmf\Module\Helper;
13:
14: /**
15: * Manage cache interaction in a module. Cache key will be prefixed
16: * with the module name to segregate it from keys set by other modules
17: * or system functions. Cache data is by definition serialized, so
18: * any arbitrary data (i.e. array, object) can be stored.
19: *
20: * @category Xmf\Module\Helper\Cache
21: * @package Xmf
22: * @author trabis <lusopoemas@gmail.com>
23: * @author Richard Griffith <richard@geekwright.com>
24: * @copyright 2011-2018 XOOPS Project (https://xoops.org)
25: * @license GNU GPL 2.0 or later (https://www.gnu.org/licenses/gpl-2.0.html)
26: * @link https://xoops.org
27: */
28: class Cache extends AbstractHelper
29: {
30: /**
31: * @var string
32: */
33: protected $prefix;
34:
35: /**
36: * @var XoopsCache
37: */
38: protected $cache;
39:
40: /**
41: * Initialize parent::__construct calls this after verifying module object.
42: *
43: * @return void
44: */
45: public function init()
46: {
47: \XoopsLoad::load('xoopscache');
48: $this->prefix = $this->module->getVar('dirname') . '_';
49: $this->cache = \XoopsCache::getInstance();
50: }
51:
52: /**
53: * Add our module prefix to a name
54: *
55: * @param string $name name to prefix
56: *
57: * @return string module prefixed name
58: */
59: protected function prefix($name)
60: {
61: return $this->prefix . $name;
62: }
63:
64: /**
65: * Write a value for a key to the cache
66: *
67: * @param string $key Identifier for the data
68: * @param mixed $value Data to be cached - anything except a resource
69: * @param int|null $ttl Time to live in seconds
70: *
71: * @return bool True if the data was successfully cached, false on failure
72: */
73: public function write($key, $value, $ttl = null)
74: {
75: return $this->cache->write($this->prefix($key), $value, $ttl);
76: }
77:
78: /**
79: * Read value for a key from the cache
80: *
81: * @param string $key Identifier for the data
82: * @param mixed $default default value to return if config $key is not set
83: *
84: * @return mixed value if key was set, false not set or expired
85: */
86: public function read($key, $default = false)
87: {
88: $value = $this->cache->read($this->prefix($key));
89: return (false !== $value) ? $value : $default;
90: }
91:
92: /**
93: * Delete a key from the cache
94: *
95: * @param string $key Identifier for the data
96: *
97: * @return void
98: */
99: public function delete($key)
100: {
101: $this->cache->delete($this->prefix($key));
102: }
103:
104: /**
105: * cache block wrapper
106: *
107: * If the cache read for $key is a miss, call the $regenFunction to update it.
108: *
109: * @param string $key Identifier for the cache item
110: * @param callable $regenFunction function to generate cached content
111: * @param int|null $ttl time to live, number of seconds as integer
112: * or null for default
113: * @param mixed $args variable argument list for $regenFunction
114: *
115: * @return mixed
116: */
117: public function cacheRead($key, $regenFunction, $ttl = null, $args = null)
118: {
119: if (null === $args) {
120: $varArgs = array();
121: } else {
122: $varArgs = func_get_args();
123: array_shift($varArgs); // pull off $key
124: array_shift($varArgs); // pull off $regenFunction
125: array_shift($varArgs); // pull off $ttl
126: }
127:
128: $cachedContent = $this->read($key);
129:
130: // Check to see if the cache missed, which could mean that it either didn't exist or was stale.
131: if ($cachedContent === false) {
132: // Run the relatively expensive code.
133: $cachedContent = call_user_func_array($regenFunction, $varArgs);
134:
135: // save result
136: $this->write($key, $cachedContent, $ttl);
137: }
138:
139: return $cachedContent;
140: }
141: }
142: