Verzeichnisstruktur phpBB-3.0.0
- Veröffentlicht
- 12.12.2007
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
acm_file.php
001 <?php
002 /**
003 *
004 * @package acm
005 * @version $Id$
006 * @copyright (c) 2005 phpBB Group
007 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
008 *
009 */
010
011 /**
012 * @ignore
013 */
014 if (!defined('IN_PHPBB'))
015 {
016 exit;
017 }
018
019 /**
020 * ACM File Based Caching
021 * @package acm
022 */
023 class acm
024 {
025 var $vars = array();
026 var $var_expires = array();
027 var $is_modified = false;
028
029 var $sql_rowset = array();
030 var $sql_row_pointer = array();
031 var $cache_dir = '';
032
033 /**
034 * Set cache path
035 */
036 function acm()
037 {
038 global $phpbb_root_path;
039 $this->cache_dir = $phpbb_root_path . 'cache/';
040 }
041
042 /**
043 * Load global cache
044 */
045 function load()
046 {
047 global $phpEx;
048 if (file_exists($this->cache_dir . 'data_global.' . $phpEx))
049 {
050 @include($this->cache_dir . 'data_global.' . $phpEx);
051 }
052 else
053 {
054 return false;
055 }
056
057 return true;
058 }
059
060 /**
061 * Unload cache object
062 */
063 function unload()
064 {
065 $this->save();
066 unset($this->vars);
067 unset($this->var_expires);
068 unset($this->sql_rowset);
069 unset($this->sql_row_pointer);
070
071 $this->vars = array();
072 $this->var_expires = array();
073 $this->sql_rowset = array();
074 $this->sql_row_pointer = array();
075 }
076
077 /**
078 * Save modified objects
079 */
080 function save()
081 {
082 if (!$this->is_modified)
083 {
084 return;
085 }
086
087 global $phpEx;
088
089 if ($fp = @fopen($this->cache_dir . 'data_global.' . $phpEx, 'wb'))
090 {
091 @flock($fp, LOCK_EX);
092 fwrite($fp, "<?php\n\$this->vars = " . var_export($this->vars, true) . ";\n\n\$this->var_expires = " . var_export($this->var_expires, true) . "\n?>");
093 @flock($fp, LOCK_UN);
094 fclose($fp);
095
096 @chmod($this->cache_dir . 'data_global.' . $phpEx, 0666);
097 }
098 else
099 {
100 // Now, this occurred how often? ... phew, just tell the user then...
101 if (!@is_writable($this->cache_dir))
102 {
103 trigger_error($this->cache_dir . ' is NOT writable.', E_USER_ERROR);
104 }
105
106 trigger_error('Not able to open ' . $this->cache_dir . 'data_global.' . $phpEx, E_USER_ERROR);
107 }
108
109 $this->is_modified = false;
110 }
111
112 /**
113 * Tidy cache
114 */
115 function tidy()
116 {
117 global $phpEx;
118
119 $dir = @opendir($this->cache_dir);
120
121 if (!$dir)
122 {
123 return;
124 }
125
126 while (($entry = readdir($dir)) !== false)
127 {
128 if (!preg_match('/^(sql_|data_(?!global))/', $entry))
129 {
130 continue;
131 }
132
133 $expired = true;
134 @include($this->cache_dir . $entry);
135 if ($expired)
136 {
137 $this->remove_file($this->cache_dir . $entry);
138 }
139 }
140 closedir($dir);
141
142 if (file_exists($this->cache_dir . 'data_global.' . $phpEx))
143 {
144 if (!sizeof($this->vars))
145 {
146 $this->load();
147 }
148
149 foreach ($this->var_expires as $var_name => $expires)
150 {
151 if (time() > $expires)
152 {
153 $this->destroy($var_name);
154 }
155 }
156 }
157
158 set_config('cache_last_gc', time(), true);
159 }
160
161 /**
162 * Get saved cache object
163 */
164 function get($var_name)
165 {
166 if ($var_name[0] == '_')
167 {
168 global $phpEx;
169
170 if (!$this->_exists($var_name))
171 {
172 return false;
173 }
174
175 @include($this->cache_dir . "data{$var_name}.$phpEx");
176 return (isset($data)) ? $data : false;
177 }
178 else
179 {
180 return ($this->_exists($var_name)) ? $this->vars[$var_name] : false;
181 }
182 }
183
184 /**
185 * Put data into cache
186 */
187 function put($var_name, $var, $ttl = 31536000)
188 {
189 if ($var_name[0] == '_')
190 {
191 global $phpEx;
192
193 if ($fp = @fopen($this->cache_dir . "data{$var_name}.$phpEx", 'wb'))
194 {
195 @flock($fp, LOCK_EX);
196 fwrite($fp, "<?php\n\$expired = (time() > " . (time() + $ttl) . ") ? true : false;\nif (\$expired) { return; }\n\n\$data = " . var_export($var, true) . ";\n?>");
197 @flock($fp, LOCK_UN);
198 fclose($fp);
199
200 @chmod($this->cache_dir . "data{$var_name}.$phpEx", 0666);
201 }
202 }
203 else
204 {
205 $this->vars[$var_name] = $var;
206 $this->var_expires[$var_name] = time() + $ttl;
207 $this->is_modified = true;
208 }
209 }
210
211 /**
212 * Purge cache data
213 */
214 function purge()
215 {
216 // Purge all phpbb cache files
217 $dir = @opendir($this->cache_dir);
218
219 if (!$dir)
220 {
221 return;
222 }
223
224 while (($entry = readdir($dir)) !== false)
225 {
226 if (strpos($entry, 'sql_') !== 0 && strpos($entry, 'data_') !== 0 && strpos($entry, 'ctpl_') !== 0 && strpos($entry, 'tpl_') !== 0)
227 {
228 continue;
229 }
230
231 $this->remove_file($this->cache_dir . $entry);
232 }
233 closedir($dir);
234
235 unset($this->vars);
236 unset($this->var_expires);
237 unset($this->sql_rowset);
238 unset($this->sql_row_pointer);
239
240 $this->vars = array();
241 $this->var_expires = array();
242 $this->sql_rowset = array();
243 $this->sql_row_pointer = array();
244
245 $this->is_modified = false;
246 }
247
248 /**
249 * Destroy cache data
250 */
251 function destroy($var_name, $table = '')
252 {
253 global $phpEx;
254
255 if ($var_name == 'sql' && !empty($table))
256 {
257 if (!is_array($table))
258 {
259 $table = array($table);
260 }
261
262 $dir = @opendir($this->cache_dir);
263
264 if (!$dir)
265 {
266 return;
267 }
268
269 while (($entry = readdir($dir)) !== false)
270 {
271 if (strpos($entry, 'sql_') !== 0)
272 {
273 continue;
274 }
275
276 // The following method is more failproof than simply assuming the query is on line 3 (which it should be)
277 $check_line = @file_get_contents($this->cache_dir . $entry);
278
279 if (empty($check_line))
280 {
281 continue;
282 }
283
284 // Now get the contents between /* and */
285 $check_line = substr($check_line, strpos($check_line, '/* ') + 3, strpos($check_line, ' */') - strpos($check_line, '/* ') - 3);
286
287 $found = false;
288 foreach ($table as $check_table)
289 {
290 // Better catch partial table names than no table names. ;)
291 if (strpos($check_line, $check_table) !== false)
292 {
293 $found = true;
294 break;
295 }
296 }
297
298 if ($found)
299 {
300 $this->remove_file($this->cache_dir . $entry);
301 }
302 }
303 closedir($dir);
304
305 return;
306 }
307
308 if (!$this->_exists($var_name))
309 {
310 return;
311 }
312
313 if ($var_name[0] == '_')
314 {
315 $this->remove_file($this->cache_dir . 'data' . $var_name . ".$phpEx");
316 }
317 else if (isset($this->vars[$var_name]))
318 {
319 $this->is_modified = true;
320 unset($this->vars[$var_name]);
321 unset($this->var_expires[$var_name]);
322
323 // We save here to let the following cache hits succeed
324 $this->save();
325 }
326 }
327
328 /**
329 * Check if a given cache entry exist
330 */
331 function _exists($var_name)
332 {
333 if ($var_name[0] == '_')
334 {
335 global $phpEx;
336 return file_exists($this->cache_dir . 'data' . $var_name . ".$phpEx");
337 }
338 else
339 {
340 if (!sizeof($this->vars))
341 {
342 $this->load();
343 }
344
345 if (!isset($this->var_expires[$var_name]))
346 {
347 return false;
348 }
349
350 return (time() > $this->var_expires[$var_name]) ? false : isset($this->vars[$var_name]);
351 }
352 }
353
354 /**
355 * Load cached sql query
356 */
357 function sql_load($query)
358 {
359 global $phpEx;
360
361 // Remove extra spaces and tabs
362 $query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
363 $query_id = sizeof($this->sql_rowset);
364
365 if (!file_exists($this->cache_dir . 'sql_' . md5($query) . ".$phpEx"))
366 {
367 return false;
368 }
369
370 @include($this->cache_dir . 'sql_' . md5($query) . ".$phpEx");
371
372 if (!isset($expired))
373 {
374 return false;
375 }
376 else if ($expired)
377 {
378 $this->remove_file($this->cache_dir . 'sql_' . md5($query) . ".$phpEx");
379 return false;
380 }
381
382 $this->sql_row_pointer[$query_id] = 0;
383
384 return $query_id;
385 }
386
387 /**
388 * Save sql query
389 */
390 function sql_save($query, &$query_result, $ttl)
391 {
392 global $db, $phpEx;
393
394 // Remove extra spaces and tabs
395 $query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
396 $filename = $this->cache_dir . 'sql_' . md5($query) . '.' . $phpEx;
397
398 if ($fp = @fopen($filename, 'wb'))
399 {
400 @flock($fp, LOCK_EX);
401
402 $query_id = sizeof($this->sql_rowset);
403 $this->sql_rowset[$query_id] = array();
404 $this->sql_row_pointer[$query_id] = 0;
405
406 while ($row = $db->sql_fetchrow($query_result))
407 {
408 $this->sql_rowset[$query_id][] = $row;
409 }
410 $db->sql_freeresult($query_result);
411
412 $file = "<?php\n\n/* " . str_replace('*/', '*\/', $query) . " */\n";
413 $file .= "\n\$expired = (time() > " . (time() + $ttl) . ") ? true : false;\nif (\$expired) { return; }\n";
414
415 fwrite($fp, $file . "\n\$this->sql_rowset[\$query_id] = " . var_export($this->sql_rowset[$query_id], true) . ";\n?>");
416 @flock($fp, LOCK_UN);
417 fclose($fp);
418
419 @chmod($filename, 0666);
420
421 $query_result = $query_id;
422 }
423 }
424
425 /**
426 * Ceck if a given sql query exist in cache
427 */
428 function sql_exists($query_id)
429 {
430 return isset($this->sql_rowset[$query_id]);
431 }
432
433 /**
434 * Fetch row from cache (database)
435 */
436 function sql_fetchrow($query_id)
437 {
438 if ($this->sql_row_pointer[$query_id] < sizeof($this->sql_rowset[$query_id]))
439 {
440 return $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]++];
441 }
442
443 return false;
444 }
445
446 /**
447 * Fetch a field from the current row of a cached database result (database)
448 */
449 function sql_fetchfield($query_id, $field)
450 {
451 if ($this->sql_row_pointer[$query_id] < sizeof($this->sql_rowset[$query_id]))
452 {
453 return (isset($this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]][$field])) ? $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]][$field] : false;
454 }
455
456 return false;
457 }
458
459 /**
460 * Seek a specific row in an a cached database result (database)
461 */
462 function sql_rowseek($rownum, $query_id)
463 {
464 if ($rownum >= sizeof($this->sql_rowset[$query_id]))
465 {
466 return false;
467 }
468
469 $this->sql_row_pointer[$query_id] = $rownum;
470 return true;
471 }
472
473 /**
474 * Free memory used for a cached database result (database)
475 */
476 function sql_freeresult($query_id)
477 {
478 if (!isset($this->sql_rowset[$query_id]))
479 {
480 return false;
481 }
482
483 unset($this->sql_rowset[$query_id]);
484 unset($this->sql_row_pointer[$query_id]);
485
486 return true;
487 }
488
489 /**
490 * Removes/unlinks file
491 */
492 function remove_file($filename)
493 {
494 if (!@unlink($filename))
495 {
496 // E_USER_ERROR - not using language entry - intended.
497 trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);
498 }
499 }
500 }
501
502 ?>