|
1 <?php |
|
2 /** |
|
3 * Smarty Internal Plugin |
|
4 * |
|
5 * @package Smarty |
|
6 * @subpackage Cacher |
|
7 */ |
|
8 |
|
9 /** |
|
10 * Cache Handler API |
|
11 * |
|
12 * @package Smarty |
|
13 * @subpackage Cacher |
|
14 * @author Rodney Rehm |
|
15 */ |
|
16 abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource { |
|
17 |
|
18 /** |
|
19 * fetch cached content and its modification time from data source |
|
20 * |
|
21 * @param string $id unique cache content identifier |
|
22 * @param string $name template name |
|
23 * @param string $cache_id cache id |
|
24 * @param string $compile_id compile id |
|
25 * @param string $content cached content |
|
26 * @param integer $mtime cache modification timestamp (epoch) |
|
27 * @return void |
|
28 */ |
|
29 protected abstract function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime); |
|
30 |
|
31 /** |
|
32 * Fetch cached content's modification timestamp from data source |
|
33 * |
|
34 * {@internal implementing this method is optional. |
|
35 * Only implement it if modification times can be accessed faster than loading the complete cached content.}} |
|
36 * |
|
37 * @param string $id unique cache content identifier |
|
38 * @param string $name template name |
|
39 * @param string $cache_id cache id |
|
40 * @param string $compile_id compile id |
|
41 * @return integer|boolean timestamp (epoch) the template was modified, or false if not found |
|
42 */ |
|
43 protected function fetchTimestamp($id, $name, $cache_id, $compile_id) |
|
44 { |
|
45 return null; |
|
46 } |
|
47 |
|
48 /** |
|
49 * Save content to cache |
|
50 * |
|
51 * @param string $id unique cache content identifier |
|
52 * @param string $name template name |
|
53 * @param string $cache_id cache id |
|
54 * @param string $compile_id compile id |
|
55 * @param integer|null $exp_time seconds till expiration or null |
|
56 * @param string $content content to cache |
|
57 * @return boolean success |
|
58 */ |
|
59 protected abstract function save($id, $name, $cache_id, $compile_id, $exp_time, $content); |
|
60 |
|
61 /** |
|
62 * Delete content from cache |
|
63 * |
|
64 * @param string $name template name |
|
65 * @param string $cache_id cache id |
|
66 * @param string $compile_id compile id |
|
67 * @param integer|null $exp_time seconds till expiration time in seconds or null |
|
68 * @return integer number of deleted caches |
|
69 */ |
|
70 protected abstract function delete($name, $cache_id, $compile_id, $exp_time); |
|
71 |
|
72 /** |
|
73 * populate Cached Object with meta data from Resource |
|
74 * |
|
75 * @param Smarty_Template_Cached $cached cached object |
|
76 * @param Smarty_Internal_Template $_template template object |
|
77 * @return void |
|
78 */ |
|
79 public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) |
|
80 { |
|
81 $_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null; |
|
82 $_compile_id = isset($cached->compile_id) ? preg_replace('![^\w\|]+!', '_', $cached->compile_id) : null; |
|
83 |
|
84 $cached->filepath = sha1($cached->source->filepath . $_cache_id . $_compile_id); |
|
85 $this->populateTimestamp($cached); |
|
86 } |
|
87 |
|
88 /** |
|
89 * populate Cached Object with timestamp and exists from Resource |
|
90 * |
|
91 * @param Smarty_Template_Cached $source cached object |
|
92 * @return void |
|
93 */ |
|
94 public function populateTimestamp(Smarty_Template_Cached $cached) |
|
95 { |
|
96 $mtime = $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id); |
|
97 if ($mtime !== null) { |
|
98 $cached->timestamp = $mtime; |
|
99 $cached->exists = !!$cached->timestamp; |
|
100 return; |
|
101 } |
|
102 $timestamp = null; |
|
103 $this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $cached->content, $timestamp); |
|
104 $cached->timestamp = isset($timestamp) ? $timestamp : false; |
|
105 $cached->exists = !!$cached->timestamp; |
|
106 } |
|
107 |
|
108 /** |
|
109 * Read the cached template and process the header |
|
110 * |
|
111 * @param Smarty_Internal_Template $_template template object |
|
112 * @param Smarty_Template_Cached $cached cached object |
|
113 * @return booelan true or false if the cached content does not exist |
|
114 */ |
|
115 public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null) |
|
116 { |
|
117 if (!$cached) { |
|
118 $cached = $_template->cached; |
|
119 } |
|
120 $content = $cached->content ? $cached->content : null; |
|
121 $timestamp = $cached->timestamp ? $cached->timestamp : null; |
|
122 if ($content === null || !$timestamp) { |
|
123 $this->fetch( |
|
124 $_template->cached->filepath, |
|
125 $_template->source->name, |
|
126 $_template->cache_id, |
|
127 $_template->compile_id, |
|
128 $content, |
|
129 $timestamp |
|
130 ); |
|
131 } |
|
132 if (isset($content)) { |
|
133 $_smarty_tpl = $_template; |
|
134 eval("?>" . $content); |
|
135 return true; |
|
136 } |
|
137 return false; |
|
138 } |
|
139 |
|
140 /** |
|
141 * Write the rendered template output to cache |
|
142 * |
|
143 * @param Smarty_Internal_Template $_template template object |
|
144 * @param string $content content to cache |
|
145 * @return boolean success |
|
146 */ |
|
147 public function writeCachedContent(Smarty_Internal_Template $_template, $content) |
|
148 { |
|
149 return $this->save( |
|
150 $_template->cached->filepath, |
|
151 $_template->source->name, |
|
152 $_template->cache_id, |
|
153 $_template->compile_id, |
|
154 $_template->properties['cache_lifetime'], |
|
155 $content |
|
156 ); |
|
157 } |
|
158 |
|
159 /** |
|
160 * Empty cache |
|
161 * |
|
162 * @param Smarty $smarty Smarty object |
|
163 * @param integer $exp_time expiration time (number of seconds, not timestamp) |
|
164 * @return integer number of cache files deleted |
|
165 */ |
|
166 public function clearAll(Smarty $smarty, $exp_time=null) |
|
167 { |
|
168 $this->cache = array(); |
|
169 return $this->delete(null, null, null, $exp_time); |
|
170 } |
|
171 |
|
172 /** |
|
173 * Empty cache for a specific template |
|
174 * |
|
175 * @param Smarty $smarty Smarty object |
|
176 * @param string $resource_name template name |
|
177 * @param string $cache_id cache id |
|
178 * @param string $compile_id compile id |
|
179 * @param integer $exp_time expiration time (number of seconds, not timestamp) |
|
180 * @return integer number of cache files deleted |
|
181 */ |
|
182 public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) |
|
183 { |
|
184 $this->cache = array(); |
|
185 return $this->delete($resource_name, $cache_id, $compile_id, $exp_time); |
|
186 } |
|
187 |
|
188 /** |
|
189 * Check is cache is locked for this template |
|
190 * |
|
191 * @param Smarty $smarty Smarty object |
|
192 * @param Smarty_Template_Cached $cached cached object |
|
193 * @return booelan true or false if cache is locked |
|
194 */ |
|
195 public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) |
|
196 { |
|
197 $id = $cached->filepath; |
|
198 $name = $cached->source->name . '.lock'; |
|
199 |
|
200 $mtime = $this->fetchTimestamp($id, $name, null, null); |
|
201 if ($mtime === null) { |
|
202 $this->fetch($id, $name, null, null, $content, $mtime); |
|
203 } |
|
204 |
|
205 return $mtime && time() - $mtime < $smarty->locking_timeout; |
|
206 } |
|
207 |
|
208 /** |
|
209 * Lock cache for this template |
|
210 * |
|
211 * @param Smarty $smarty Smarty object |
|
212 * @param Smarty_Template_Cached $cached cached object |
|
213 */ |
|
214 public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) |
|
215 { |
|
216 $cached->is_locked = true; |
|
217 |
|
218 $id = $cached->filepath; |
|
219 $name = $cached->source->name . '.lock'; |
|
220 $this->save($id, $name, null, null, $smarty->locking_timeout, ''); |
|
221 } |
|
222 |
|
223 /** |
|
224 * Unlock cache for this template |
|
225 * |
|
226 * @param Smarty $smarty Smarty object |
|
227 * @param Smarty_Template_Cached $cached cached object |
|
228 */ |
|
229 public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) |
|
230 { |
|
231 $cached->is_locked = false; |
|
232 |
|
233 $name = $cached->source->name . '.lock'; |
|
234 $this->delete($name, null, null, null); |
|
235 } |
|
236 } |
|
237 ?> |