Cache class
Code (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
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
<?php
class Libary_Cache {
/**
* @acces Protected.
* @var $_location String.
*/
protected $_location = null;
/**
* @acces Protected.
* @var $_lifetime Integer.
*/
protected $_lifetime = 3600;
/**
* @acces Public.
* @param $directory String.
* @param $lifetime Integer.
*/
public function __construct($directory, $lifetime = null) {
$this->setLocation($directory);
if (null !== $lifetime) {
$this->setLifetime($lifetime);
}
}
/**
* @acces Protected.
* @param $directory String.
*/
protected function setLocation($directory) {
if (!is_dir($directory)) {
throw new Libary_Cache_Exception(sprintf('Failed to initialize %s class, directory \'%s\' does not exists.', __CLASS__, $directory));
}
$this->_location = (string) trim($directory, '\\').'\\';
}
/**
* @acces Protected.
* @param $lifetime Integer.
*/
protected function setLifetime($lifetime) {
$this->_lifetime = (integer) $lifetime;
}
/**
* @acces Protected.
* @param $key String.
* @return String.
*/
protected function getFile($key) {
return $this->_location.'cache_'.md5($key);
}
/**
* @acces Public.
* @param $key String.
* @param $data Mixed.
* @param $lifetime Integer.
*/
public function set($key, $data, $lifetime = null) {
if (!$handler = fopen($this->getFile($key), 'w')) {
throw new Libary_Cache_Exception(sprintf('Failed to initialize %s class, could not write \'%s\' to cache.', __CLASS__, $key));
}
$cacheData = serialize(array(
'lifetime' => (time() + ((null === $lifetime) ? $this->_lifetime : (integer) $lifetime)),
'data' => $data
));
fwrite($handler, $cacheData);
fclose($handler);
return $this;
}
/**
* @acces Public.
* @param $key String.
* @return Mixed.
*/
public function __get($key) {
return $this->get($key);
}
/**
* @acces Public.
* @param $key String.
* @return Mixed.
*/
public function get($key) {
if (!$this->exists($key)) {
throw new Libary_Cache_Exception(sprintf('Failed to initialize %s class, could not read \'%s\' from cache.', __CLASS__, $key));
}
$cacheData = unserialize(file_get_contents($this->getFile($key)));
if (($cacheData['lifetime'] - time()) < 0) {
unlink($this->getFile($key));
}
return $cacheData['data'];
}
/**
* @acces Public.
* @param $keys String/Array.
*/
public function remove($keys) {
if (func_num_args() > 1) {
$keys = func_get_args();
}else if (is_string($keys)) {
$keys = array($keys);
}
foreach ($keys as $key) {
if ($this->exists($key)) {
unlink($this->getFile($key));
}
}
return $this;
}
/**
* @acces Public.
*/
public function clear() {
foreach (glob($this->_location.'cache_*') as $cacheFile) {
unlink($cacheFile);
}
return $this;
}
/**
* @acces Public.
* @param $key String.
* @return Boolean.
*/
public function exists($key) {
return (file_exists($this->getFile($key))) ? true : false;
}
}
?>
class Libary_Cache {
/**
* @acces Protected.
* @var $_location String.
*/
protected $_location = null;
/**
* @acces Protected.
* @var $_lifetime Integer.
*/
protected $_lifetime = 3600;
/**
* @acces Public.
* @param $directory String.
* @param $lifetime Integer.
*/
public function __construct($directory, $lifetime = null) {
$this->setLocation($directory);
if (null !== $lifetime) {
$this->setLifetime($lifetime);
}
}
/**
* @acces Protected.
* @param $directory String.
*/
protected function setLocation($directory) {
if (!is_dir($directory)) {
throw new Libary_Cache_Exception(sprintf('Failed to initialize %s class, directory \'%s\' does not exists.', __CLASS__, $directory));
}
$this->_location = (string) trim($directory, '\\').'\\';
}
/**
* @acces Protected.
* @param $lifetime Integer.
*/
protected function setLifetime($lifetime) {
$this->_lifetime = (integer) $lifetime;
}
/**
* @acces Protected.
* @param $key String.
* @return String.
*/
protected function getFile($key) {
return $this->_location.'cache_'.md5($key);
}
/**
* @acces Public.
* @param $key String.
* @param $data Mixed.
* @param $lifetime Integer.
*/
public function set($key, $data, $lifetime = null) {
if (!$handler = fopen($this->getFile($key), 'w')) {
throw new Libary_Cache_Exception(sprintf('Failed to initialize %s class, could not write \'%s\' to cache.', __CLASS__, $key));
}
$cacheData = serialize(array(
'lifetime' => (time() + ((null === $lifetime) ? $this->_lifetime : (integer) $lifetime)),
'data' => $data
));
fwrite($handler, $cacheData);
fclose($handler);
return $this;
}
/**
* @acces Public.
* @param $key String.
* @return Mixed.
*/
public function __get($key) {
return $this->get($key);
}
/**
* @acces Public.
* @param $key String.
* @return Mixed.
*/
public function get($key) {
if (!$this->exists($key)) {
throw new Libary_Cache_Exception(sprintf('Failed to initialize %s class, could not read \'%s\' from cache.', __CLASS__, $key));
}
$cacheData = unserialize(file_get_contents($this->getFile($key)));
if (($cacheData['lifetime'] - time()) < 0) {
unlink($this->getFile($key));
}
return $cacheData['data'];
}
/**
* @acces Public.
* @param $keys String/Array.
*/
public function remove($keys) {
if (func_num_args() > 1) {
$keys = func_get_args();
}else if (is_string($keys)) {
$keys = array($keys);
}
foreach ($keys as $key) {
if ($this->exists($key)) {
unlink($this->getFile($key));
}
}
return $this;
}
/**
* @acces Public.
*/
public function clear() {
foreach (glob($this->_location.'cache_*') as $cacheFile) {
unlink($cacheFile);
}
return $this;
}
/**
* @acces Public.
* @param $key String.
* @return Boolean.
*/
public function exists($key) {
return (file_exists($this->getFile($key))) ? true : false;
}
}
?>
Gewijzigd op 27/07/2012 10:20:00 door Joakim Broden
Gewijzigd op 26/07/2012 16:52:43 door - Raoul -
Gewijzigd op 26/07/2012 16:57:32 door Joakim Broden
Hertog Jan op 26/07/2012 16:57:15:
... mits je weet wat hij doet. Want aan gewoon kopieer en plak heb je niks ...
Wel ja, eventueel kan je daar nog aan werken.
Extra documentatie met uitleg over de bedoeling van de class en van de methodes.
En ook zeker @return in je documentatie opnemen.
Maar ik begrijp dat je toch eerst een ander soort commentaar wil horen.
---
EDIT: oh, sorry, ik zie dat je enkel de return niet documenteert als je $this terggeeft.
Dit is om aan chained linking te doen, veronderstel ik.
Gewijzigd op 26/07/2012 17:50:05 door Kris Peeters
En inderdaad als ik $this return documenteer ik dat niet en dat is inderdaad voor chained linking. Zodat ik bv dit kan doen:
ipv
Misschien is het handig om dit ook met een array te maken? Dus:
Gewijzigd op 26/07/2012 18:07:27 door Joakim Broden
Gewijzigd op 26/07/2012 18:12:51 door Wouter J
Ik zie een aantal mogelijkheden.
- removeCache standaard een array geven
- Een extra methode removeCaches aanmaken, die intern removeCache aanroept.
- removeCache slim genoeg maken zodat je zowel 1 key als string kan geven als een array
Dit zou zeker alle drie werken, maar wat is principieel gezien meer de OOP way?
(Ik ben ook niet echt de beste referentie wat OOP betreft)
En Wouter heb jij eventueel nog feedback wat betreft OOP? :-D
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function foo($caches) {
if (1 < $args = func_num_args()) {
// meerdere argumenten
$caches = func_get_args();
} elseif (is_array($caches)) {
// array
$caches = $caches;
} else {
// string
$caches = array($caches);
}
foreach ($caches as $cache) {
// do something
}
}
// mogelijkheden
foo('Hello');
foo(array('hello', 'world');
foo('hello', 'world');
?>
function foo($caches) {
if (1 < $args = func_num_args()) {
// meerdere argumenten
$caches = func_get_args();
} elseif (is_array($caches)) {
// array
$caches = $caches;
} else {
// string
$caches = array($caches);
}
foreach ($caches as $cache) {
// do something
}
}
// mogelijkheden
foo('Hello');
foo(array('hello', 'world');
foo('hello', 'world');
?>
Hertog Jan op 26/07/2012 16:57:15:
Natuurlijk mag je hem gebruiken (anders zette ik hem niet online), mits je weet wat hij doet. Want aan gewoon kopieer en plak heb je niks en leer je ook niks van. En ik ben geen expert in OOP dus ik wacht nog wel op feedback van gevorderde mensen hier op het forum ;-)
Bedankt! Ik weet wel hoe caching werkt, maar ik heb simpelweg geen tijd om zo'n klasse zelf te schrijven :-)
Zie beginpost voor volledige code.
ik zou ook Library_cache doen ipv Libary_cache :)
;-) Typefoutje, danke