blob: 29f4d78b2b360b277a24360f5bc9df6a0ba63034 (
plain) (
blame)
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
|
<?php
/**
* Cache with file system
*/
class FileCache implements CacheInterface
{
protected $path;
protected $key;
public function __construct()
{
if (!is_writable(PATH_CACHE)) {
returnServerError(
'RSS-Bridge does not have write permissions for '
. PATH_CACHE . '!'
);
}
}
public function loadData()
{
if (file_exists($this->getCacheFile())) {
return unserialize(file_get_contents($this->getCacheFile()));
}
return null;
}
public function saveData($data)
{
// Notice: We use plain serialize() here to reduce memory footprint on
// large input data.
$writeStream = file_put_contents($this->getCacheFile(), serialize($data));
if ($writeStream === false) {
throw new \Exception('Cannot write the cache... Do you have the right permissions ?');
}
return $this;
}
public function getTime()
{
$cacheFile = $this->getCacheFile();
clearstatcache(false, $cacheFile);
if (file_exists($cacheFile)) {
$time = filemtime($cacheFile);
return ($time !== false) ? $time : null;
}
return null;
}
public function purgeCache($seconds)
{
$cachePath = $this->getPath();
if (file_exists($cachePath)) {
$cacheIterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($cachePath),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($cacheIterator as $cacheFile) {
if (in_array($cacheFile->getBasename(), ['.', '..', '.gitkeep'])) {
continue;
} elseif ($cacheFile->isFile()) {
if (filemtime($cacheFile->getPathname()) < time() - $seconds) {
unlink($cacheFile->getPathname());
}
}
}
}
}
/**
* Set scope
* @return self
*/
public function setScope($scope)
{
if (is_null($scope) || !is_string($scope)) {
throw new \Exception('The given scope is invalid!');
}
$this->path = PATH_CACHE . trim($scope, " \t\n\r\0\x0B\\\/") . '/';
return $this;
}
/**
* Set key
* @return self
*/
public function setKey($key)
{
if (!empty($key) && is_array($key)) {
$key = array_map('strtolower', $key);
}
$key = json_encode($key);
if (!is_string($key)) {
throw new \Exception('The given key is invalid!');
}
$this->key = $key;
return $this;
}
/**
* Return cache path (and create if not exist)
* @return string Cache path
*/
private function getPath()
{
if (is_null($this->path)) {
throw new \Exception('Call "setScope" first!');
}
if (!is_dir($this->path)) {
if (mkdir($this->path, 0755, true) !== true) {
throw new \Exception('Unable to create ' . $this->path);
}
}
return $this->path;
}
/**
* Get the file name use for cache store
* @return string Path to the file cache
*/
private function getCacheFile()
{
return $this->getPath() . $this->getCacheName();
}
/**
* Determines file name for store the cache
* return string
*/
private function getCacheName()
{
if (is_null($this->key)) {
throw new \Exception('Call "setKey" first!');
}
return hash('md5', $this->key) . '.cache';
}
}
|