/
SystemCache.php
193 lines (155 loc) · 3.61 KB
/
SystemCache.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?php
namespace Elgg\Cache;
use Elgg\Profilable;
/**
* WARNING: API IN FLUX. DO NOT USE DIRECTLY.
*
* @access private
*
* @package Elgg.Core
* @subpackage Cache
* @since 1.10.0
*/
class SystemCache {
use Profilable;
/**
* Global Elgg configuration
*
* @var \stdClass
*/
private $CONFIG;
/**
* Constructor
*/
public function __construct() {
global $CONFIG;
$this->CONFIG = $CONFIG;
}
/**
* Returns an \ElggCache object suitable for caching system information
*
* @todo Can this be done in a cleaner way?
* @todo Swap to memcache etc?
*
* @return \ElggFileCache
*/
function getFileCache() {
/**
* A default filestore cache using the dataroot.
*/
static $FILE_PATH_CACHE;
if (!$FILE_PATH_CACHE) {
$FILE_PATH_CACHE = new \ElggFileCache($this->CONFIG->dataroot . 'system_cache/');
}
return $FILE_PATH_CACHE;
}
/**
* Reset the system cache by deleting the caches
*
* @return void
*/
function reset() {
$this->getFileCache()->clear();
}
/**
* Saves a system cache.
*
* @param string $type The type or identifier of the cache
* @param string $data The data to be saved
* @return bool
*/
function save($type, $data) {
if ($this->CONFIG->system_cache_enabled) {
return $this->getFileCache()->save($type, $data);
}
return false;
}
/**
* Retrieve the contents of a system cache.
*
* @param string $type The type of cache to load
* @return string
*/
function load($type) {
if ($this->CONFIG->system_cache_enabled) {
$cached_data = $this->getFileCache()->load($type);
if ($cached_data) {
return $cached_data;
}
}
return null;
}
/**
* Enables the system disk cache.
*
* Uses the 'system_cache_enabled' datalist with a boolean value.
* Resets the system cache.
*
* @return void
*/
function enable() {
_elgg_services()->datalist->set('system_cache_enabled', 1);
$this->CONFIG->system_cache_enabled = 1;
$this->reset();
}
/**
* Disables the system disk cache.
*
* Uses the 'system_cache_enabled' datalist with a boolean value.
* Resets the system cache.
*
* @return void
*/
function disable() {
_elgg_services()->datalist->set('system_cache_enabled', 0);
$this->CONFIG->system_cache_enabled = 0;
$this->reset();
}
/**
* Loads the system cache during engine boot
*
* @see elgg_reset_system_cache()
* @access private
*/
function loadAll() {
if ($this->timer) {
$this->timer->begin([__METHOD__]);
}
$this->CONFIG->system_cache_loaded = false;
if (!_elgg_services()->views->configureFromCache($this)) {
return;
}
$data = $this->load('view_types');
if (!is_string($data)) {
return;
}
$GLOBALS['_ELGG']->view_types = unserialize($data);
// Note: We don't need view_overrides for operation. Inspector can pull this from the cache
$this->CONFIG->system_cache_loaded = true;
if ($this->timer) {
$this->timer->end([__METHOD__]);
}
}
/**
* Initializes the simplecache lastcache variable and creates system cache files
* when appropriate.
*
* @access private
*/
function init() {
if (!$this->CONFIG->system_cache_enabled) {
return;
}
// cache system data if enabled and not loaded
if (!$this->CONFIG->system_cache_loaded) {
$this->save('view_types', serialize($GLOBALS['_ELGG']->view_types));
_elgg_services()->views->cacheConfiguration($this);
}
if (!$GLOBALS['_ELGG']->i18n_loaded_from_cache) {
_elgg_services()->translator->reloadAllTranslations();
foreach ($GLOBALS['_ELGG']->translations as $lang => $map) {
$this->save("$lang.lang", serialize($map));
}
}
}
}