-
Notifications
You must be signed in to change notification settings - Fork 280
/
Cache.php
172 lines (152 loc) · 3.81 KB
/
Cache.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
<?php
/**
* RedBeanPHP Cache Plugin
*
* @file RedBean/Plugin/Cache.php
* @description Cache plugin, caches beans.
*
* @author Gabor de Mooij and the RedBeanPHP community
* @license BSD/GPLv2
*
* Provides a means to cache beans after loading or batch loading.
*
* copyright (c) G.J.G.T. (Gabor) de Mooij and the RedBeanPHP Community
* This source file is subject to the BSD/GPLv2 License that is bundled
* with this source code in the file license.txt.
*/
class RedBean_Plugin_Cache extends RedBean_OODB implements RedBean_Plugin {
/**
* Bean cache, contains the cached beans identified by
* label keys containing the type id and the fetch method;
* i.e. single load or batch load.
*
* @var array
*/
private $cache = array();
/**
* Number of hits (beans/calls being served from cache).
* Can be used to monitor cache performance.
*
* @var integer
*/
private $hits = 0;
/**
* Number of misses (beans not being served from cache), can be
* used to monitor cache performance.
*
* @var integer
*/
private $misses = 0;
/**
* Constructor.
* Cache decorates RedBeanPHP OODB class, so needs a writer.
*
* @param RedBean_QueryWriter $writer
*/
public function __construct(RedBean_QueryWriter $writer) {
parent::__construct($writer);
}
/**
* Loads a bean by type and id. If the bean cannot be found an
* empty bean will be returned instead. This is a cached version
* of the loader, if the bean has been cached it will be served
* from cache, otherwise the bean will be retrieved from the database
* as usual an a new cache entry will be added..
*
* @param string $type type of bean you are looking for
* @param integer $id identifier of the bean
*
* @return RedBean_OODBBean $bean the bean object found
*/
public function load($type,$id) {
if (isset($this->cache[$type][$id])) {
$this->hits ++;
$bean = $this->cache[$type][$id];
}
else {
$this->misses ++;
$bean = parent::load($type,$id);
if (!isset($this->cache[$type])) $this->cache[$type]=array();
$this->cache[$type][$id] = $bean;
}
return $bean;
}
/**
* Stores a RedBean OODBBean and caches it.
*
* @param RedBean_OODBBean $bean the bean you want to store
*
* @return integer $id
*/
public function store( $bean ) {
$id = parent::store($bean);
$type = $bean->getMeta('type');
if (!isset($this->cache[$type])) $this->cache[$type]=array();
$this->cache[$type][$id] = $bean;
return $id;
}
/**
* Trashes a RedBean OODBBean and removes it from cache.
*
* @param RedBean_OODBBean $bean bean
* @return mixed
*/
public function trash( $bean ) {
$type = $bean->getMeta('type');
$id = $bean->id;
if (isset($this->cache[$type][$id])) unset($this->cache[$type][$id]);
return parent::trash($bean);
}
/**
* Flushes the cache for a given type.
*
* @param string $type
*
* @return RedBean_Plugin_Cache
*/
public function flush($type) {
if (isset($this->cache[$type])) $this->cache[$type]=array();
return $this;
}
/**
* Flushes the cache completely.
*
* @return RedBean_Plugin_Cache
*/
public function flushAll() {
$this->cache = array();
return $this;
}
/**
* Returns the number of hits. If a call to load() or
* batch() can use the cache this counts as a hit.
* Otherwise it's a miss.
*
* @return integer
*/
public function getHits() {
return $this->hits;
}
/**
* Returns the number of hits. If a call to load() or
* batch() can use the cache this counts as a hit.
* Otherwise it's a miss.
*
* @return integer
*/
public function getMisses() {
return $this->misses;
}
/**
* Resets hits counter to 0.
*/
public function resetHits() {
$this->hits = 0;
}
/**
* Resets misses counter to 0.
*/
public function resetMisses() {
$this->misses = 0;
}
}