2 namespace dns\system\cache\source
;
5 * DiskCacheSource is an implementation of CacheSource that stores the cache as simple files in the file system.
7 * @author Alexander Ebert, Marcel Werk
8 * @copyright 2001-2014 WoltLab GmbH
9 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
10 * @package com.woltlab.wcf
11 * @subpackage system.cache.source
12 * @category Community Framework
14 class DiskCacheSource
implements ICacheSource
{
16 * @see \dns\system\cache\source\ICacheSource::flush()
18 public function flush($cacheName, $useWildcard) {
20 $this->removeFiles('cache.'.$cacheName.'*.php');
23 $this->removeFiles('cache.'.$cacheName.'.php');
28 * @see \dns\system\cache\source\ICacheSource::flushAll()
30 public function flushAll() {
31 $this->removeFiles('cache.*.php');
35 * @see \dns\system\cache\source\ICacheSource::get()
37 public function get($cacheName, $maxLifetime) {
38 $filename = $this->getFilename($cacheName);
39 if ($this->needRebuild($filename, $maxLifetime)) {
45 return $this->readCache($cacheName, $filename);
47 catch (\Exception
$e) {
53 * @see \dns\system\cache\source\ICacheSource::set()
55 public function set($cacheName, $value, $maxLifetime) {
56 $filename = $this->getFilename($cacheName);
57 $content = "<?php exit; /* cache: ".$cacheName." (generated at ".gmdate('r').") DO NOT EDIT THIS FILE */ ?>\n";
58 $content .= serialize($value);
60 if (!file_exists($filename)) {
64 $handler = fOpen($filename, "a+");
65 fWrite($handler, $content);
70 * Returns cache filename.
72 * @param string $cacheName
75 protected function getFilename($cacheName) {
76 return DNS_DIR
.'/cache/cache.'.$cacheName.'.php';
80 * Removes files matching given pattern.
82 * @param string $pattern
84 protected function removeFiles($pattern) {
85 $directory = DNS_DIR
.'cache/';
87 foreach (glob($directory.$pattern) as $filename) {
93 * Determines wheater the cache needs to be rebuild or not.
95 * @param string $filename
96 * @param integer $maxLifetime
99 protected function needRebuild($filename, $maxLifetime) {
100 // cache does not exist
101 if (!file_exists($filename)) {
106 if (!@filesize
($filename)) {
110 // cache resource was marked as obsolete
111 if (($mtime = filemtime($filename)) <= 1) {
115 // maxlifetime expired
116 if ($maxLifetime > 0 && (time() - $mtime) > $maxLifetime) {
120 // do not rebuild cache
125 * Loads the file of a cached resource.
127 * @param string $cacheName
128 * @param string $filename
131 protected function readCache($cacheName, $filename) {
133 $contents = file_get_contents($filename);
135 // find first newline
136 $position = strpos($contents, "\n");
137 if ($position === false) {
138 throw new \
Exception("Unable to load cache resource '".$cacheName."'");
142 $contents = substr($contents, $position +
1);
145 $value = @unserialize
($contents);
146 if ($value === false) {
147 throw new \
Exception("Unable to load cache resource '".$cacheName."'");